android蓝牙频繁断、连之后,某次在连接成功之后去发现蓝牙服务的回调结果中,特征值服务列表为Null或者长度为0,

BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {
            if (status == BluetoothGatt.GATT_SUCCESS && newState == BluetoothProfile.STATE_CONNECTED) {
                //连接成功之后,去发现蓝牙服务
                gatt.discoverServices();
            }                                
        }
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if(gatt.getServices() == null){
                // do something
            }
            for (BluetoothGattService gattService : gatt.getServices()) {
                  // do something
            }
        }
}


优化方案1:延迟去发现蓝牙服务gatt.discoverServices();  经过验证,不可行,仍然会出现发现不了蓝牙服务的现象;

优化方法2:每次去连接之前,先gatt.close()一下,效果也不明显;

究极方案:当发现蓝牙服务列表为0的情况下,去重新发现蓝牙服务(gatt.discoverServices()) 或者 先断开蓝牙连接,然后再重新调用connect方法(亲测有效)
这里我在某款机型(大概8次出现1次)经过如此优化之后,虽然仍然会出现发现不了蓝牙服务的情况,但是能保证下一次基本上都可以顺利订阅特征值服务成功且建立连接成功;
其他像蓝牙连接133、连接异常、连接超时,其实都可以通过先断开蓝牙连接、再重连 来增大我们连接的成功率(android机型差异较大,此重连方式在一定程度上可以提高连接成功率,提升用户体验)。

如有帮助,记得点赞三连~~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐