网站首页 > 技术教程 正文
蓝牙音乐之AVRCP在安卓系统中的实现
从《蓝牙音乐之AVRCP 》协议分析中可知,音视频远端控制协议被分成两部分:CT + TG,因此安卓源码也相应的分为 avrcp + avrcpcontroller 两部分。一般情况下avrcp对应TG,配置于手机等接收控制指令的设备,而avrcpcontroller则对应CT,配置在蓝牙耳机、车载蓝牙等可以主动发起控制的设备上。
本篇文章分析使用的安卓版本:android-9(P版本)
因为AVRCP中的指令都是以CT端发起请求,TG端做出答复的形式进行的,所以本期分享就以CT为视角,学习AVRCP协议在安卓系统中的是如何实现的。
AVRCP协议在安卓系统中结构如下:
从上面的架构图可以看出AVRCP的架构类似于蓝牙的其他协议,但也有不同。不同之处在于应用层还通过安卓系统中的媒体浏览器服务 MediaBrowserService 与蓝牙服务进行通信,为何要多此一举呢?
查看安卓官方说明,安卓系统通过媒体浏览器服务已经为大家提供了一套完整的音乐控制解决方案,并进行了封装。所以音乐类应用通过媒体浏览器服务可以轻松实现音乐控制等功能。那对蓝牙音乐也不例外,从而安卓蓝牙对外提供的接口文件 BluetoothAvrcpController 中,从安卓N版本(API:24)及之后的版本是没有音乐控制的接口,而之前的版本通过BluetoothAvrcpController.sendPassThroughCmd()接口直接将控制指令下发到蓝牙服务层。
蓝牙音乐应用根据当前系统的安卓版本通过构建相应的 ComponentName 来初始化媒体浏览器服务的客户端也即是 MediaBrowser 来连接媒体浏览器服务的服务端 MediaBrowserService,连接成功后应用获取到 MediaController 来控制音乐。
因为ComponentName指明了bind哪个服务,从而可以正确找到蓝牙服务中对应于媒体浏览器的服务。根据蓝牙服务的清单文件AndroidManifest.xml指定,应用构建相应的ComponentName,构建此变量需要提供包名package和类名class。
mComponentName = new ComponentName(package,class);
由于安卓版本迭代相关参数有所变化:
1、android-7(N版本) ~ android-9(P版本):
String package = "com.android.bluetooth";
String class = "com.android.bluetooth.a2dpsink.mbs.A2dpMediaBrowserService"
2、android-10(Q版本):
String package = "com.android.bluetooth";
String class = "com.android.bluetooth.avrcpcontroller.BluetoothMediaBrowserService"
蓝牙音乐应用最终通过 MediaController.getTransportControls()提供的音乐控制接口下发相应的指令,指令经过媒体浏览器服务转送到蓝牙服务中,通过蓝牙技术传输到远端设备执行响应的动作,最终达到控制蓝牙音乐的目的。
继续分析蓝牙的接口文件BluetoothAvrcpController,没有提供协议连接断开的接口,那AVRCP协议是如何连接的呢?还记得《A2DP音频流在安卓系统中的实现 》中留下的一个坑嘛:A2DP连接成功后,sink端的协议栈会主动发起AVRCP的连接,今天这篇文章就来给大家填坑了。
AVRCP连接
从上期协议分析篇知晓了AVRCP的连接也涉及到了两条通道的建立:控制通道 + 浏览通道(双方都支持浏览功能),那次协议的连接流程主要是建立两条L2CAP链路的过程,但第一步还是发起SDP服务,这是蓝牙连接中必不可少的一环。连接的时序简图如下:
蓝牙音乐应用只需要注册如下系统广播监听AVRCP的连接状态改变:
如果应用还关系浏览通道是否连接成功,还需注册如下系统广播来监听:
连接流程在HCI层的交互如下:
底层两条l2cap链路通道成功建立,应用层也已通过媒体浏览服务框架和蓝牙服务绑定成功,则蓝牙音乐应用就能随心所欲地控制远端蓝牙设备上的音乐了。
本篇AVRCP协议在安卓系统中的实现及连接流程就分享到这里,感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!
猜你喜欢
- 2025-01-06 老手才懂的技能:Win10竟藏有这些“真香”功能
- 2025-01-06 安卓取代者:谷歌Fuchsia OS操作系统已获蓝牙认证
- 2025-01-06 苹果防丢追踪器网页上线 浏览器输入可跟踪的日常物品
- 2025-01-06 北通宙斯游戏手柄至强版本公测!蓝牙直连NS正式实装
- 2025-01-06 WP8.1/WP8版UC浏览器v4.1下载:地址联想优化
- 2025-01-06 iOS 14 允许用户设置默认电子邮件、浏览器应用
- 2025-01-06 Pinecil V2蓝牙LE烙铁增加了web界面
- 2025-01-06 ESP32使用MicroPython设置低功耗蓝牙广播通过Chrome Web蓝牙通信
- 2025-01-06 PICO 4 Ultra OS推送V5.12.0.U系统版本更新
- 2025-01-06 表白520 QQ浏览器走进十大“最666校园”
你 发表评论:
欢迎- 04-27spring框架怎么实现依赖注入?
- 04-27卸载 Mac 应用程序的 4 种基础方法
- 04-27用户界面框架jQuery EasyUI示例大全之Application
- 04-27win7 64位 server.CreateObject("excel.application")
- 04-27SpringCloud的配置文件bootstrap和application的区别
- 04-27Excel VBA小技巧:用Application.Version判断用户Excel版本
- 04-27JSA宏教程——应用程序(Application)对象事件
- 04-27详解flink 1.11中的新部署模式-Application模式
- 最近发表
-
- spring框架怎么实现依赖注入?
- 卸载 Mac 应用程序的 4 种基础方法
- 用户界面框架jQuery EasyUI示例大全之Application
- win7 64位 server.CreateObject("excel.application")
- SpringCloud的配置文件bootstrap和application的区别
- Excel VBA小技巧:用Application.Version判断用户Excel版本
- JSA宏教程——应用程序(Application)对象事件
- 详解flink 1.11中的新部署模式-Application模式
- 为什么CEO念“C~E~O”,而APP却不能念A~P~P?
- 汇川技术|Inoproshop软件中Application简介及常用功能
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)