Android蓝牙从机模式实现概述
Comment概述
Android的蓝牙的上层逻辑在系统应用Bluetooth中,Bluetooth提供了各种service,系统设置中的蓝牙设置通过aidl控制蓝牙.
Bluetooth包括主机模式和从机模式的所有实现,手机平板等设备默认开启主机模式的各服务,若要实现从机模式需要修改源码并实现自己的从机模式应用.
蓝牙设置相关的内容由服务com.android.bluetooth.btservice.AdapterService
进行控制
Android开放api中提供了android.bluetooth.BluetoothAdapter
可以对蓝牙进行一些控制包括开关和扫描的开始和停止.
相关的方法需要添加对应权限才可进行调用:
<uses-permission android:name="android.permission.BLUETOOTH" /> |
蓝牙中包含的协议内容
a2dp
主机蓝牙音乐a2dpsink
从机蓝牙音乐avrcp
主机蓝牙音乐控制avrcpcontroller
从机蓝牙音乐控制gatt
蓝牙设备之间进行通信的协议,必须开启hdp
健康设备协议hfp
主机蓝牙电话hfpclient
从机蓝牙电话hid
人机接口设备,蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等map
设备间的信息交换,比如短信彩信的发送mapclient
设备间的信息交换接收端opp
对象存储规范,数据传输pan
wifi共享pbap
通讯录通信记录的发送pabpclient
通讯录通信记录的接收sap
带有内置 GSM 收发器的车载电话之类的设备连接到 Bluetooth 电话中的 SIM 卡sdp
提供发现服务的机制
Android Bluetooth功能配置
android的这些蓝牙协议通过不同的服务实现,并在config.xml进行开关配置
源码一般以主机模式配置,如果需要修改a2dp_sink,avrcp_controller,hfpClient的内容并关闭主机模式
其中的pbapclient实际上是使用socket进行传输,可参考源码自行在应用中实现,开启后会自动同步通讯录和通话记录并保存到设备通讯录中,不好控制.可根据需求进行选配.
<bool name="profile_supported_a2dp">false</bool> |
蓝牙相关功能的实现
蓝牙的开关状态和扫描状态等很多状态都通过广播进行通知,并在intent中附带extra对信息进行携带
这些广播有些定义在BluetoothAdapter中,有些定义在BluetoothDevice中,有些为隐藏api,需要使用framework.jar才能进行访问
//蓝牙开关状态 包括开关和正在打开和正在关闭 |
不搞通过阅读源码,发现在系统设置的依赖库SettingsLib
中包含了对大量蓝牙相关功能的封装
在BluetoothEventManager
中对所有广播进行了管理,并提供BluetoothCallback回调进行结果反馈,BluetoothCallback总共提供了多个回调方法:onBluetoothStateChanged
状态改变onScanningStateChanged
扫描状态改变onDeviceAdded
扫描到设备onDeviceDeleted
移除设备onDeviceBondStateChanged
配对状态改变onConnectionStateChanged
连接状态改变,但是不同profile可以分开断开连接,所以实际无用onActiveDeviceChanged
活动状态改变,从机时无用onAudioModeChanged
蓝牙电话的音频模式改变
使用LocalBluetoothManager
获取BluetoothEventManager
对象,注册回调后即可对其进行监听LocalBluetoothManager
同时对BluetoothAdapter
的一些方法进行了封装,可以获取其中的LocalBluetoothAdapter
对象进行获取
具体的相关实现可以查看SlaveBluetoothLibApi28/Set