本文主要论述基于android 6.0的蓝牙上层(Java层)通话机制;总结了蓝牙通话框架,并且给出了接听电话的详细的流程图;最后说明了apk的实现以及总结了蓝牙/android 相关的知识点。

1, 蓝牙框架
主要代码路径:

路径1: frameworks\base\core\java\android\bluetooth\

蓝牙相关接口,蓝牙各种功能的发起点。

路径2:packages\apps\Bluetooth\src\com\android\bluetooth\

独立的Bluetooth.apk,里面包含蓝牙相关的各种服务,是java层和C/C++层的桥梁。

路径3: packages\apps\Bluetooth\jni\

调用底层C/C++实现各种蓝牙功能,并且反馈给java层。

在路径2里面还有各种相互独立的java代码包,每一个包都包含一个协议,实现一个具体的功能:

btservice: 统一管理,控制其他服务。

a2dp: 和蓝牙耳机,音频有关,比如听歌等。

avrcp: 音频/视频通过连接的蓝牙控制,比如放歌时控制暂停等。

gatt:低功耗BLE有关,比如蓝牙按键。

hdp: 蓝牙医疗有关

hfp和hfpclient : 蓝牙通话有关,比如蓝牙通话的相关操作

hid: 蓝牙键盘键盘/鼠标

map: 同步蓝牙短信相关

opp: 蓝牙传输,比如传输文件等

pan: 个人局域网

pbap: 同步电话本,比如联系人/通话记录等

sap : 蓝牙通话,主要和SIM卡相关

sdp: 蓝牙服务发现/获取相关

这12个包分别实现了12中蓝牙功能,大多数以服务的形式存在,运行在Bluetooth.apk中。不仅如此,还具有以下特点:

1,每一个服务相互独立,互相毫无任何影响, 继承自 ProfileService,由

AdapterService服务统一管理。

2,每一个服务在路径1中都存在对应的客户端类,通过Binder进行跨进程通信。

3,每一个服务在路径3中都存在对应的C/C++类,通过JNI机制互相调用。

4,每一个服务的启动,对应的Binder以及JNI机制的调用原理,方法,流程几乎都是一样的。

下面以蓝牙通话功能为例来解析相关接口以及代码实现框架图。

2 蓝牙通话框架
2.1 相关类的说明
蓝牙通话上层代码主要分为3个部分:

1,蓝牙api相关代码, 路径4: frameworks\base\core\java\android\bluetooth\

主要有2个类

BluetoothHeadsetClient.java主要负责蓝牙通话的相关动作,比如接听等等

BluetoothHeadsetClientCall.java主要负责蓝牙通话的状态,比如是来电还是去电等等。

2,蓝牙服务端的相关代码,路径5:

packages\apps\Bluetooth\src\com\android\bluetooth\hfpclient\

有3个类

HeadsetClientHalConstants.java类里面只是定义了一些int/boolean 类型的值。

HeadsetClientService.java从名字就知道它是一个服务,它的设计很有意思,里面还有一个BluetoothHeadsetClientBinder内部类,该内部类主要负责和

BluetoothHeadsetClient进行跨进程通信。另外,HeadsetClientService也是

BluetoothHeadsetClientBinder和HeadsetClientStateMachine之间的桥梁。

HeadsetClientStateMachine是一个状态机,即管理连接的状态也是通话时java和C/C++之间的桥梁,通过JNI机制和com_android_bluetooth_hfpclient 里面的方法互相调用。

3,JNI相关代码,路径6: packages\apps\Bluetooth\jni\

有1个文件:

com_android_bluetooth_hfpclient  蓝牙通话动作,拨号/接听/挂断/拒接 实际的执行者。

DialerBTHfpService服务是开机之后启动的。

2.2类图

图一 类图
BluetoothHeadsetClient是一个api,由第三方apk直接调用,可以进行拨号/接听/拒接/挂断操作,对应的方法依次为dial()/acceptCall()/rejectCall()/terminateCall().

HeadsetClientService是一个服务, BluetoothHeadsetClientBinder是它的内部类, BluetoothHeadsetClientBinder是BluetoothHeadsetClient在HeadsetClientService中的代理,通过aidl进行方法的调用。

Connected(已连接状态)是HeadsetClientStateMachine 的其中一种状态,通话的相关操作都建立在已连接状态之上,其它三种状态为Disconnected, Connecting,

AudioOn状态。HeadsetClientService 根据不同的方法给状态机发送不同的消息,最后通过HeadsetClientStateMachine根据JNI机制调用

com_android_bluetooth_hfpclient.cpp对应的方法,最后调用底层C/C++ 来真正的实现拨号/接听/拒接/挂断操作。

拨号/接听/拒接/挂断方法调用的流程完全是一模一样的,下小节给出接听方法具体调用的完整流程图。

2.3流程图

图二 接听电话流程图
除了dial 方法最后调用从C/C++ dialNative之外,其它的3个方法最后都是调用handleCallActionNative,只是参数不同而已。

拨号/接听/拒接/挂断都是主动完成的,那么如果有来电,对方接通电话或者对方挂断电话,我们怎么知道呢?这些都是com_android_bluetooth_hfpclient.cpp通过JNI机制调用通话状态机的方法sendCallChangedIntent,将电话的状态(包含在

BluetoothHeadsetClientCall.java中)通过广播发送出来,第三方apk监听状态就可以进行相应的操作了。具体的来电流程图如下:

图三 来电流程图

3 蓝牙通话apk说明
在自己的apk中,只需要做2件事情就可以完成蓝牙通话的几乎所有动作,

1,根据上一小节的论述,注册BluetoothHeadsetClientCall相关广播,监听来电/接通/对方挂断的状态,获取蓝牙电话的相关信息,比如号码,设备信息等等。

比如,如果收到来电广播,就可以根据BluetoothHeadsetClientCall获取来电的号码等信息,然后显示来电界面。

2,通过BluetoothAdapter 获取并且初始化BluetoothHeadsetClient对象,然后就可以直接调用dial()/acceptCall()/rejectCall()/terminateCall() 方法进行拨号/接听/拒接/挂断的操作了。

4, 小节
利用api实现蓝牙通话不是很难,但是如果弄清楚具体的蓝牙通话机制以及细节甚至蓝牙相关功能,这就得下功夫了,关于蓝牙,还可以进一步研究的android知识点以及蓝牙涉及的上层java要点如下:

1,基本蓝牙功能:打开/关闭/扫描/配对/连接

2,蓝牙功能:通过蓝牙传输文件/蓝牙键盘/蓝牙医疗服务/蓝牙同步联系人等等

3,android知识:跨进程通信机制/JNI机制/反射机制/状态机机制等等。

蓝牙电话通话机制原理相关推荐

  1. 2021年大数据Kafka(九):kafka消息存储及查询机制原理

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 kafka消息存储及查询机制原理 一.Kafka数据存储机制 ...

  2. 【阿里云课程】注意力机制原理,应用与设计

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第10课中的一节,介绍如下: 注意力机制原理与设计 本次课程是阿里天池联合有三AI推出的深度学习系列课程第10期,深度学习模 ...

  3. python类加载机制_PHP面向对象自动加载机制原理与用法分析

    本文实例讲述了PHP面向对象自动加载机制原理与用法.分享给大家供大家参考,具体如下: 在学习PHP的面向对象的时候,会知道很多"语法糖",也就是魔术方法.有一个加自动加载的魔术方法 ...

  4. Kafka设计解析(八)- Exactly Once语义与事务机制原理

    本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本文所有Kafka原理性的描述除特殊说明外均基于Kafka 1.0.0版 ...

  5. Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结

    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结 1. 微内核与插件的优点1 2. 插件的注册与使用2 2.1. Ioc容器中注册插件2 2.2. 启动器微内核启动3 ...

  6. Spark之Master主备切换机制原理

    Spark之Master主备切换机制原理

  7. Attention注意力机制–原理与应用

    Attention注意力机制–原理与应用 注意力机制即Attention mechanism在序列学习任务上具有巨大的提升作用,在编解码器框架内,通过在编码段加入A模型,对源数据序列进行数据加权变换, ...

  8. TADF材料的机制原理;TADF的机理;热活化延迟荧光如何产生?

    TADF材料的机制原理:TADF的机理:热活化延迟荧光如何产生? TADF的机理 TADF材料的机制原理 TADF是激子从S1态开始的特殊的辐射跃迁[28-29],如图1.9 所示,单线态激子可以通过 ...

  9. binder机制原理分析(一):ServiceManager 进程启动

    binder机制原理分析一共分5个部分,其实省了一点,但是分析到后面都差不多了,以后再补充吧. 1.ServiceManager 进程启动 2.普通Service注册到ServiceManager 3 ...

最新文章

  1. 国外开源威胁情报feed站点 简介
  2. 在nodejs中的集成虹软人脸识别
  3. ITK:区域最大图像过滤器
  4. eclipse软件有时会退出弹出一串错误弹框_修复iPhone上的iOS 13软件更新失败错误...
  5. 如何查看spark消耗的内存_Spark优化(三)----数据本地化及内存调优
  6. 一个人的战斗---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十九)[转]...
  7. docker ubuntu16安装
  8. 字符串API中的split,substr,substring
  9. Android6.0动态权限
  10. IIS安装时,安装程序无法复制一个或多个文件。特定错误码是0x4b8
  11. 5款不错的整站下载工具
  12. C++关于函数声明定义的位置
  13. 《霍比特人2》:我靠,洞里有条好大的龙!!!
  14. 摄像机投影成像 matlab,使用matlab仿真三维物点的透视投影成像.doc
  15. 用PowerPoint巧做特效字幕(转)
  16. Microsoft365 个人版激活流程(前提:已有秘钥)
  17. Genymotion 各对应版本
  18. 利用css制作3D照片墙
  19. 把x带入方程的c语言,C语言编程,用C语言编写下面这个方程。方程:x²(x-A)=B 注:A和B都是已知常数,x是待求未知数。...
  20. BK7256,上海博通-FreeRtos平台,智能家居中控屏,旋钮屏等方案介绍

热门文章

  1. Python培训课程推荐
  2. poi ppt 作者属性 修改_ppt文字属性-如何让PowerPoint里作者等信息不被修改自己辛辛苦苦做的工 爱问知识人...
  3. 四﹑博客周刊•推荐Blog专家
  4. cgb2110-day13
  5. c#加入json库引用,添加JSON包引用;新到Java
  6. [源码解析] 深度学习分布式训练框架 horovod (11) --- on spark --- GLOO 方案
  7. -17的计算机编码,大众电脑编码大全
  8. 内涵TV段子,价值500元的dz内涵笑话商业源码
  9. vue 动态生成下载二维码
  10. android 输入法 悬浮窗口,Android EditText悬浮在输入法之上