android蓝牙连接133问题的解决办法---(连接篇)

上一篇文章介绍了“蓝牙扫描”,今天来说一下android蓝牙连接过程中133的问题:

我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率。个人发现的一个规律是:一般出现蓝牙连接133的问题,大多是android低配机型(虽然上层调用了gatt.close()方法,但手机底层蓝牙服务可能仍与设备保持连接状态,其所占用蓝牙资源不能及时释放,所以导致了我们连接一直出现133的问题)。

这里先说一下常规操作:我们在蓝牙连接失败或者断开连接时,一定要及时的进行gatt.disconnect()和gatt.close()操作;但是在实际的开发过程中,我们可能会进入一种死循环:即如果一旦出现连接133的情况下,如果不断开蓝牙开关一次或设备重新上电一次,可能会一直出现133的情况。这种情况显然不是我们想看到的,所以个人总结出一套亲测有效的方法(此方法无法100%规避出现133的问题,但可以提高出现133情况之后再去连接的成功率),下面看一段刚刚写的一段demo,但实际项目仍会有很有需要优化的地方,仅供参考:

/**
 * 连接设备(为了给客官们更详尽的展示,所以把很多变量都写在了方法内,实际项目中很多变量不会在方法内初始化)
 * 入参:设备mac地址
 * @param mac
 */
private  void  connectDevice(final String mac){
    // 获取蓝牙适配器
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if(bluetoothAdapter == null){
        Log.d("connectDevice","bluetoothAdapter is null");
        return;
    }
    // 根据mac地址获取蓝牙设备实例对象,当然此处的bluetoothDevice也可以通过蓝牙扫描得到
    BluetoothDevice bluetoothDevice = bluetoothAdapter.getRemoteDevice(mac);
    if(bluetoothDevice == null){
        Log.d("connectDevice","this device is not exist");
        return;
    }
    // 由于今天只讨论蓝牙连接问题,所以这里仅重写了"监测连接状态变化"的方法
    gattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            if(status == 0){ //表示gatt服务成功
                if(newState == BluetoothProfile.STATE_CONNECTED){  // 连接成功状态
                      //连接成功之后的操作
                }else if(newState == BluetoothProfile.STATE_DISCONNECTED){ // 断开连接状态
                      //断开连接之后的操作
                }
            }else {
                gatt.disconnect();
                gatt.close();
                if(status == 133){ //经典错误:133
                   //提示:此处我们可以根据全局的一个flag,去重试连接一次,以增大连接成功率
                    if(!isRetry){
                        isRetry = true;
                        connectDevice(mac);
                    }
                }
            }
        }
    };
    // gatt为全局变量,获取当前gatt服务下连接的设备
    if(gatt != null && gatt.getConnectedDevices() != null){
        for(BluetoothDevice device:gatt.getConnectedDevices()){
            if(device.getAddress().equals(mac)){  // 如果当前遍历出的连接设备与我们需要连得设备是同一设备
                gatt.disconnect(); //先去断开之前未正常断开的连接,解决连接133的问题
            }
        }
        gatt.close(); //释放gatt服务
        gatt = null;
    }

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        gatt = bluetoothDevice.connectGatt(MainActivity.this,
                false, gattCallback, TRANSPORT_LE);  //
    } else {
        gatt = bluetoothDevice.connectGatt(MainActivity.this,
                false, gattCallback);
    }
}

关于蓝牙连接的问题先告一段落了,后面有时间会继续分享BluetoothGattCallback内的其他方法的作用。也欢迎大家指正以及提出宝贵的意见,互相进步。谢谢~

 

你可能感兴趣的:(安卓技术心得)