Android 蓝牙手柄连接流程解析和自动化方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010215167/article/details/82563259

为了提高蓝牙手柄的连接成功率,实现自动连接蓝牙手柄,替代用户手动连接蓝牙手柄的整个流程。

首先,我们将“连接蓝牙手柄”这个步骤拆分开来,可以细分为搜索、识别、配对、连接四个步骤。为了能够提升自动连接蓝牙手柄的成功率,需要把自动连接的各个流程步骤作为切入点,进行优化,来提升成功率:
这里写图片描述

一、搜索

在开发的过程中,会发现在启动蓝牙设备搜索的时候,当手柄晚一点时间开启开关,小部分手机或是tv会搜索不到手柄,怀疑是厂商进行了优化,系统在一定时间内搜索不到蓝牙设备,会停止搜索,因为startDiscovery是十分消耗性能的操作。
虽然我们的搜索超时时间设置为30s,但是后半段时间几乎是空等,没有利用上的。因此在在搜索的过程中,我将30s分为两半,假如当前15s没有搜索到蓝牙手柄的时候,后15s会取消前一次搜索,重新启动一次搜索,增加了搜索到蓝牙手柄的概率;
这里写图片描述

二、识别

最初是通过获取搜索到的蓝牙设备的名称,然后与蓝牙手柄名单关键字列表进行匹配,判断是否属于蓝牙手柄。但是存在一些边界情况,比如当手机的名称修改为含有手柄关键字名称的时候,就会出现误判情况。手柄关键字名单的更新也存在不实时的问题。
所以在后面通过蓝牙设备的类型进行识别,在系统API中Major代表设备的主要功能类型,通过demo验证各种手柄,发现Major都是属于PERIPHERAL类型,即外设类型。
这里写图片描述
但是在手机的系统蓝牙页面可以看到,虽然都是蓝牙手柄设备,同属于外设类型,但是不用厂商的手柄居然会显示不同的图标。
这里写图片描述
于是通过源码去寻找细分外设类型的方法。在系统源码中的BluetoothDevicePrefenence.java,可以发现系统将外设又区分为三种:PERIPHERAL_KEYBOARD、PERIPHERAL_KEYBOARD_POINTING、PERIPHERAL_POINTING和其他。
这里写图片描述
这里写图片描述

最后是为了适配不同厂商的蓝牙手柄,决定只要是满足主功能类型是外设,即识别为蓝牙手柄设备。

三、配对

配对这个操作相当于用户在系统蓝牙页面的为匹配设备列表中点击蓝牙设备。通过阅读系统源码后,发现了在识别到蓝牙手柄设备后,就需要开始创建匹配,通过反射调用createBond,将识别为蓝牙手柄设备进行配对。
这里写图片描述
但是在开发过程中,有时候会出现配对失败的情况,往往是两者已经配对,但是手柄却无法自动连接上。这个时候采用重试机制,在createBond返回false的时候,取消配对removeBond,再重新创建配对,提高配对成功率。
这里写图片描述

四、连接

连接步骤,同样通过反射调用connect,连接已配对的设备。
这里写图片描述

五、总结

1)很多问题的解决,可以通过阅读系统源码找到方法;
2)对于碎片化的问题,需要进行适配,才能提升成功率,减少折损;
3)无论是性能优化,还是流程效率的提升、折损的减少,都需要针对各个流程步骤,逐个进行问题的定位,定位的方式可以通过打log或是统计数据的收集、提取;
4)问题定位之后,就需要进行逻辑优化,可以通过修改策略,增加重试机制或是增加触发的时机点等其他方式;

猜你喜欢

转载自blog.csdn.net/u010215167/article/details/82563259