概述

Android的蓝牙的上层逻辑在系统应用Bluetooth中,Bluetooth提供了各种service,系统设置中的蓝牙设置通过aidl控制蓝牙.
Bluetooth包括主机模式和从机模式的所有实现,手机平板等设备默认开启主机模式的各服务,若要实现从机模式需要修改源码并实现自己的从机模式应用.
蓝牙设置相关的内容由服务com.android.bluetooth.btservice.AdapterService进行控制
Android开放api中提供了android.bluetooth.BluetoothAdapter可以对蓝牙进行一些控制包括开关和扫描的开始和停止.
相关的方法需要添加对应权限才可进行调用:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

蓝牙中包含的协议内容

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>
<bool name="profile_supported_a2dp_sink">true</bool>
<bool name="profile_supported_hdp">false</bool>
<bool name="profile_supported_hs_hfp">false</bool>
<bool name="profile_supported_hfpclient">true</bool>
<bool name="profile_supported_hid_host">false</bool>
<bool name="profile_supported_opp">false</bool>
<bool name="profile_supported_pan">false</bool>
<bool name="profile_supported_pbap">false</bool>
<bool name="profile_supported_gatt">true</bool>
<bool name="pbap_include_photos_in_vcard">false</bool>
<bool name="pbap_use_profile_for_owner_vcard">false</bool>
<bool name="profile_supported_map">false</bool>
<bool name="profile_supported_avrcp_target">false</bool>
<bool name="profile_supported_avrcp_controller">true</bool>
<bool name="profile_supported_sap">false</bool>
<bool name="profile_supported_pbapclient">false</bool>
<bool name="profile_supported_mapmce">false</bool>
<bool name="profile_supported_hid_device">false</bool>
<bool name="profile_supported_hearing_aid">false</bool>
<bool name="profile_supported_ba">false</bool>

蓝牙相关功能的实现

蓝牙的开关状态和扫描状态等很多状态都通过广播进行通知,并在intent中附带extra对信息进行携带
这些广播有些定义在BluetoothAdapter中,有些定义在BluetoothDevice中,有些为隐藏api,需要使用framework.jar才能进行访问

//蓝牙开关状态 包括开关和正在打开和正在关闭
BluetoothAdapter.ACTION_STATE_CHANGED
BluetoothAdapter.EXTRA_STATE //附带的extra
//状态对应的数值
BluetoothAdapter.STATE_ON
BluetoothAdapter.STATE_TURNING_ON
BluetoothAdapter.STATE_TURNING_OFF
BluetoothAdapter.STATE_OFF
BluetoothAdapter.ERROR


BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED //连接状态变化,从机时无效果

//扫描开始
BluetoothAdapter.ACTION_DISCOVERY_STARTED
//扫描结束
BluetoothAdapter.ACTION_DISCOVERY_FINISHED

//扫描找到设备时的广播
BluetoothDevice.ACTION_FOUND
//附带的extra,为short的rssi值
BluetoothDevice.EXTRA_RSSI
//附带的extra,为BluetoothClass
BluetoothDevice.EXTRA_CLASS
//附带的extra,为String类型的名称
BluetoothDevice.EXTRA_NAME

BluetoothDevice.ACTION_NAME_CHANGED

BluetoothDevice.ACTION_BOND_STATE_CHANGED

BluetoothDevice.ACTION_PAIRING_REQUEST

BluetoothDevice.ACTION_CLASS_CHANGED

//...

不搞通过阅读源码,发现在系统设置的依赖库SettingsLib中包含了对大量蓝牙相关功能的封装
BluetoothEventManager中对所有广播进行了管理,并提供BluetoothCallback回调进行结果反馈,BluetoothCallback总共提供了多个回调方法:
onBluetoothStateChanged 状态改变
onScanningStateChanged 扫描状态改变
onDeviceAdded 扫描到设备
onDeviceDeleted 移除设备
onDeviceBondStateChanged 配对状态改变
onConnectionStateChanged 连接状态改变,但是不同profile可以分开断开连接,所以实际无用
onActiveDeviceChanged 活动状态改变,从机时无用
onAudioModeChanged 蓝牙电话的音频模式改变

使用LocalBluetoothManager获取BluetoothEventManager对象,注册回调后即可对其进行监听
LocalBluetoothManager同时对BluetoothAdapter的一些方法进行了封装,可以获取其中的LocalBluetoothAdapter对象进行获取

具体的相关实现可以查看SlaveBluetoothLibApi28/Set