蓝牙音乐之AVRCP在安卓系统中的实现
蓝牙音乐之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);
由于安卓版本迭代相关参数有所变化:
- android-7(N版本) ~ android-9(P版本)
String package ="com.android.bluetooth";String class ="com.android.bluetooth.a2dpsink.mbs.A2dpMediaBrowserService" ;
- 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协议在安卓系统中的实现及连接流程就分享到这里,感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!
更多互联互通技术,欢迎关注微信公众号:Connectivity
蓝牙音乐之AVRCP在安卓系统中的实现相关推荐
- 蓝牙音乐SRC侧的安卓实现
蓝牙音乐SRC侧的安卓实现 随着电子产品的普及,越来越多的年轻人热衷于使用蓝牙技术来播放歌曲(相当多的手机品牌取消了耳机插孔),本篇文章就和大家聊聊蓝牙音乐SRC端在安卓系统中的实现原理. 安卓系统参 ...
- android蓝牙音乐之AVRCP介绍和使用
引言 最近做的车载蓝牙音乐开发,遇到很多问题,记录一下.也是到处东拼西凑的,勉强看看吧. AVRCP:Audio/Video Remote Control Profile,音视频远端控制协议,所以该协 ...
- A2DP音频流在安卓系统中的实现
A2DP音频流在安卓系统中的实现 通过前一篇文章<蓝牙音乐之A2DP音频流>的分享,大家都清楚了A2DP音频流的开启.暂停.数据传输等一系列协议规定,今天就带大家一探安卓系统中这部分是如何 ...
- A2DP连接在安卓系统中的实现
A2DP连接在安卓系统中的实现 在上篇<蓝牙音乐之A2DP>中简要介绍完了A2DP音频流建立过程的协议分析,该过程主要通过协商双方的编码方式信息并设置一个最优的编码方式,最后通过AVDTP ...
- x21能刷小米系统吗_小米系统是安卓系统中最强的吗?大家都错了,它是MIUI的进化版...
小米系统是安卓系统中最强的吗?大家都错了,它是MIUI的进化版 现在国产手机做得越来越好了,在硬件方面国产手机比同级别的外国品牌要厚道太多了,所以在中国,外国品牌是没有任何生存空间的.在性价比方面他们 ...
- android 系统 os,安卓系统中公认的5款手机系统,氢OS、EMUI、Flyme你用过几款?
原标题:安卓系统中公认的5款手机系统,氢OS.EMUI.Flyme你用过几款? 对于智能手机系统,我们都知道是分为安卓系统和苹果的iOS系统,但是在安卓个这个大板块下,还有着很多手机厂商自研的手机系统 ...
- 蓝牙定位技术在智慧养老系统中的应用
蓝牙耳机可能是我们对蓝牙应用比较熟悉的一个了,可是在现实生活中,蓝牙应从场景数不胜数,和我们的生活息息相关.利用蓝牙定位可以实现我们用人力无法做到的事情. XD-BLE-R9型高精度定位基站是物联网应 ...
- 安卓编译android.mk,详解安卓系统中的Android.mk文件
概述 Android.mk文件用来向编译系统描述如何编译你的源代码.更确切地说,该文件其实就是一个小型的Makefile.由于该文件会被NDK的编译工具解析多次,因此应该尽量减少源码中声明变量, ...
- 单片机音频节奏灯_单片机在音乐节奏识别灯效系统中的智能控制
0引言目前国内外市场上有一种音乐彩灯设备,它由音控多谐振荡器.时序脉冲产生器和可控硅控制电路组成.其中由555电路和电容电阻等组成无稳态多谐振荡器,使音乐信号经过耦合变压器检波,加至555的控制端,并 ...
最新文章
- CentOS6.9 ARM虚拟机扩容系统磁盘
- springboot 启动时could not exec java_面试被问为什么使用Spring Boot?答案好像没那么简单...
- SAP Spartacus Popover Component 显示与否的逻辑判定
- 2021年是“三蛇闹春,十鼠抢粮,十一牛耕田”,啥意思?
- java string 最大长度_我说我精通字符串,面试官竟然问我Java中的String有没有长度限制!?...
- 为何最近我们日子会很难过 之 第一篇
- 2009年计算机一级考试真题及答案
- Word跨文件使用格式刷
- 软件测试—十二章测试层次
- vue的下载安装和使用
- 工业机器人常用传感器解析
- 有1000个瓶子,其中有999瓶是水,1瓶是毒药
- 一维数组、二维数组的大小、长度与偏移
- 《人人都是首席质量官》vs “人人都是产品经理” 及心得
- 一文了解如何使用移动应用安全组件Soot和Flowdroid
- 黑苹果EFI文件,戴尔DELL-OptiPlex-7060and7070-Catalina
- 是一种心灵的默契,爱一个人不一定要拥有
- JAVA毕业设计钢材出入库管理系统计算机源码+lw文档+系统+调试部署+数据库
- 线性代数:约当标准型学习笔记
- 0基础建站教程,1小时建网站,王通教程