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