公司项目需求需要实现监听蓝牙耳机连接,且要获取蓝牙耳机电量功能,翻了不少官方文档,记录下技术调研代码
注:本文没有研究蓝牙配对功能
关于蓝牙权限适配
Android12以后,申请蓝牙权限需要申请一组,如新增的几个权限,需要一起申请
参考: 蓝牙权限 | Connectivity | Android Developers
打开蓝牙开关
注意,如果是Android12及以上版本,蓝牙开关打开操作需要有Bluetooth_Connect权限才能执行操作
效果就是直接打开蓝牙开关
不过Android还是有提供另外的一个方法供我们使用,就是下面的方法
此方法是API 5 就有的方法,和上面一样,Android12及以上版本,就是需要有Bluetooth_Connect权限才能执行成功,否则会抛出异常
兼容低版本和高版本,此方法兼容,调用此方法,系统会弹出一个是否允许打开蓝牙的对话提示框
至于接收回调,则是在对应的Activity中的onActivityResult()方法中处理返回结果:
- 返回结果RESULT_OK,蓝牙模块打开成功
- 返回结果RESULT_CANCELED,蓝牙模块打开失败
PS: 测试的时候,用的华为手机,系统为鸿蒙4,Android Studio显示为Android12,但是使用
bluetoothAdapter.enable()
却是能够正常弹出申请蓝牙是否打开的对话框
获取已配对的蓝牙设备列表
获取蓝牙耳机设备列表
PS: 测试过程中,发现漫步者耳机的类型识别不了为上述的四个类型…
获取当前已连接蓝牙耳机
一般只能连接一个蓝牙耳机
获取蓝牙耳机电量
此方法适应市面上大多数蓝牙耳机,但如果是AirPods,则无效果,下一章节会讲到获取AirPods电量方法
(虽然参考的文章说这个是AirPods的扩展AT命令,但实际对于正版AirPods无效果,反倒是我同事的华强北AirPods支持…)
通过注册广播,来获取到对应的AT命令,在参数可以取值
广播详情说明可看此链接蓝牙耳机 | 安卓开发者
之后在Receiver可以获取对应的AT命令参数,如下代码:
AT+IPHONEACCEV命令
该命令是用来提示蓝牙配件的电池状态,可以提示两方面:一方面是电池的电量百分比,一当面是蓝牙配件的当前的充电状态。该命令的说明见下方:
格式:AT+IPHONEACCEV=Number of key/value pairs,key1,val1,key2,val2,…
附带的参数的含义分别是:①键值对的数目:接下来的参数文本的数量;②接下来就是键值对分别是:键值为1表示的是电量,该键所对应的值就是电量百分比,使用字串”0“到”9“表示;键值为2表示的是充电状态,0表示不在充电,1表示正在充电。
举例:AT+IPHONEACCEV=1,1,3 该AT指令就说明附带了一个键值对(第一个参数是1);键是1,那么表示的是电量,且电量是40%(因为使用的是0~9,这里3就对应的百分比是40%)。
有个疑问,AirPods在电量变化后,会主动发送AT命令吗?还是说是在连接后才会发一次,之后便不再发送了?
AT +XAPL AT_CMD_TYPE_SET AB-12-0100,18
AirPods耳机电量
起初一致没找到方案,最终在github上输入了AirPods关键字,发现了有几个对于对应的开源库,测试发现下面这个能够符合要求(不过测试的时候,电量有些误差,充电仓在iphone手机上显示为8%,而android这边则显示为5%)
app原理则是通过蓝牙扫描,获取到蓝牙设备对应的设备厂商数据,并区分型号,然后做对应的处理从而获取到电量(比如说左耳机,右耳机,耳机仓)
通过蓝牙的adapter获取scanner,调用扫描方法,之后在扫描的回调里处理返回结果, 从而得到对应的电量数据
蓝牙扫描还需要一个获取定位的权限(在Android12版本之下需要),不然无法扫描
评论区