您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > Android

A2DP连接在安卓系统中的实现

时间:2020-07-22 17:05:20  来源:  作者:

A2DP连接在安卓系统中的实现

 

在上篇《蓝牙音乐之A2DP》中简要介绍完了A2DP音频流建立过程的协议分析,该过程主要通过协商双方的编码方式信息并设置一个最优的编码方式,最后通过AVDTP_OPEN建立A2DP连接。此连接最重要的是建立信令通道和数据通道这两条L2CAP链路。这篇主要和大家分享下Android/ target=_blank class=infotextkey>安卓系统中如何实现A2DP的连接。

安卓源码版本:Android-9(P版本)

A2DP连接涉及到应用层、蓝牙服务层、蓝牙协议栈及蓝牙芯片等各个模块。由于蓝牙芯片因各厂家的实现方式不一致(主要是没有代码实现资源),暂不分析,接下来主要介绍下其他模块在蓝牙音乐之A2DP连接过程中的作用。

应用层:控制连接的发起或结束、连接状态的监听。

A2DP协议的两端SRC和SNK都可以发起A2DP的连接,所以根据自己蓝牙设备的角色正确选择安卓提供的接口函数。

SRC 端通过BluetoothA2dp. connect()发起整个A2DP连接,注册如下系统广播监听连接状态的改变:

A2DP连接在安卓系统中的实现

 

SNK 端通过BluetoothA2dpSink. connect(),注册如下广播监听A2DP的连接状态:

A2DP连接在安卓系统中的实现

 

蓝牙服务层:A2DP连接状态机的切换,状态机切换时向系统中发送A2DP协议连接状态改变的广播。

蓝牙协议栈层:协议规定的主要工作都在这一层完成,是整个A2DP连接的关键,也是本篇文章的分析重点。

老读者想必都发现了这么件事,每次分析蓝牙相关协议在安卓中的实现基本上都是以Client(Sink)端为分析点,其实和Server(Source)端没啥大的区别。本次A2DP连接还是以SNK端的角色为分析点展开,SRC端的分析大同小异。

简要的A2DP连接时序图如下:

A2DP连接在安卓系统中的实现

 

从以上时序图明显可以看出A2DP连接的大部分工作都是在协议栈中完成的,连接的过程环环相扣,缺一不可。A2DP连接在协议栈具体怎么跑起来我这里就不做过多分析,感兴趣的同学可以按照上面的时序图分析,基本上也就明白其中的逻辑了。但还是有几个关键点需要提出来方便大家的学习。

A2DP的连接在协议栈的行为实际上是AVDTP协议的连接,所以发起连接前需要进行SDP服务,搜索发现对端是否支持A2DP协议以及AVDTP的版本号

A2DP连接在安卓系统中的实现

 

AVDTP的连接包括信令通道和数据通道的建立,而信令通道主要包含如下四个步骤:

  1. AVDTP_DISCOVER
  2. AVDTP_GET_CAPABILITIES(依次获取Discovery发现的每种编码方式的能力,但是AVDTP的1.3版本新增一个功能:一次性获取所有编码方式的能力AVDTP_GET_ALL_CAPABILITIES,更加方便)
  3. AVDTP_SET_CONFIGURATION
  4. AVDTP_OPEN
A2DP连接在安卓系统中的实现

 

数据通道就是简单建立一条L2CAP链路,以后蓝牙音乐的音频数据就在上面传输。

A2DP连接在安卓系统中的实现

 

协议栈在 AVDTP_GET_CAPABILITIES 获取完所有对端支持的编码方式的能力后,选取双方都支持且最优的编码方式作为本次A2DP连接的编码方式。并且通过函数 btif_a2dp_sink_update_decoder() 更新SNK端的音频解码器的配置,根据配置创建 AudioTrack,SNK端接收到的蓝牙音乐音频数据通过该AudioTrack发送到安卓音频系统中播放。

最后A2DP连接成功上报蓝牙服务层A2DP的连接状态切换到Connected后,协议栈会判断本端的蓝牙设备是否为Sink端,如果是Sink端的话,协议栈主动发起AVRCP的连接,因此安卓系统中的蓝牙API中没有AVRCP的连接,这块的知识点等以后分享再做具体分析。

本篇A2DP协议的连接在安卓系统中的实现就分享到这里,感兴趣的小伙伴欢迎私信留言一起讨论,共同学习,一起进步!



Tags:A2DP   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
在上篇《蓝牙音乐之A2DP》中简要介绍完了A2DP音频流建立过程的协议分析,该过程主要通过协商双方的编码方式信息并设置一个最优的编码方式,最后通过AVDTP_OPEN建立A2DP连接。...【详细内容】
2020-07-22  Tags: A2DP  点击:(123)  评论:(0)  加入收藏
▌简易百科推荐
今天面试遇到同学说做过内存优化,于是我一般都会问那 Bitmap 的像素内存存在哪?大多数同学都回答在 java heap 里面,就比较尴尬,理论上你做内存优化,如果连图片这个内存大户内存...【详细内容】
2021-12-23  像程序那样思考    Tags:Android开发   点击:(6)  评论:(0)  加入收藏
Android logcat日志封装logcat痛点在Android开发中使用logcat非常频繁,logcat能帮我们定位问题,但是在日常使用中发现每次使用都需要传递tag,并且会遇到输出频率很高的log,在多...【详细内容】
2021-12-22  YuCoding    Tags:Android   点击:(7)  评论:(0)  加入收藏
对项目的基本介绍 1.整个框架主要是给MVVM框架使用的,自己写完interface接口后,通过自定义的注解就能自动生成接口方法 2.用Kotlin的Flow去代替Rxjava,因为我发现RxJava功能很...【详细内容】
2021-12-08  网易Leo    Tags:Android开发   点击:(16)  评论:(0)  加入收藏
前言在Android开发过程中,有些时候会根据需要引用别的项目到当前项目里面,而且以Module形式引用。所以本篇博文就来分享一下怎么以Module形式引用别的项目到当前项目中,方便开...【详细内容】
2021-12-07  网易Leo    Tags:Android开发   点击:(21)  评论:(0)  加入收藏
作者:fundroid这篇文章偏阅读一些,大家可以了解下 Android 的一些最新动向。每年9/10月份 Google 都会举行约为期2天的 Android Dev Summit,在活动上 Google 的技术专家们会分...【详细内容】
2021-11-30  像程序那样思考    Tags:Android开发   点击:(15)  评论:(0)  加入收藏
一、 准备工作1、安装JDK,下载地址(可能需要一个oracle账号,大家百度一下或者自行注册一个就行。尽可能选择8或者11,这两个是长期版本)Java SE | Oracle Technology Network | Or...【详细内容】
2021-11-23  永沧    Tags:Android   点击:(26)  评论:(0)  加入收藏
使用Maven Publish Plugin插件。(官方支持)一、在Library的build.gradle中配置plugins { id 'com.android.library' id 'kotlin-android' id 'k...【详细内容】
2021-11-05  羊城小阳    Tags:Android   点击:(36)  评论:(0)  加入收藏
谷歌离推出Play Store应用程序的新数据隐私部分又近了一步。应用程序开发人员现在可以通过谷歌在Play控制台的新 "数据安全表 "填写相关细节。该公司表示,所需信息将从2022年...【详细内容】
2021-10-20    中关村在线  Tags:安卓   点击:(57)  评论:(0)  加入收藏
架构究竟是什么?如何更好的理解架构?我们知道一个APP通常是由class组成,而这些class之间如何组合,相互之间又如何产生作用,就是影响这个APP的关键点。细分的话我们可以将其分为类...【详细内容】
2021-09-17  像程序那样思考    Tags:Android架构   点击:(51)  评论:(0)  加入收藏
概述当Android应用程序需要访问设备上的敏感资源时,应用程序开发人员会使用权限模型。虽然该模型使用起来非常简单,但开发人员在使用权限时容易出错,从而导致安全漏洞。本文中,...【详细内容】
2021-09-07  SecTr安全团队    Tags:Android开发   点击:(66)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条