上一篇文章介绍了“蓝牙扫描”,今天来说一下android蓝牙连接过程中133的问题:
我们经常在网上看到一些答案说需要释放gatt资源,这种方式可以在一定程度上减少出现133的概率。个人发现的一个规律是:一般出现蓝牙连接133的问题,大多是android低配机型(虽然上层调用了()方法,但手机底层蓝牙服务可能仍与设备保持连接状态,其所占用蓝牙资源不能及时释放,所以导致了我们连接一直出现133的问题)。
这里先说一下常规操作:我们在蓝牙连接失败或者断开连接时,一定要及时的进行()和()操作;但是在实际的开发过程中,我们可能会进入一种死循环:即如果一旦出现连接133的情况下,如果不断开蓝牙开关一次或设备重新上电一次,可能会一直出现133的情况。这种情况显然不是我们想看到的,所以个人总结出一套亲测有效的方法(此方法无法100%规避出现133的问题,但可以提高出现133情况之后再去连接的成功率),下面看一段刚刚写的一段demo,但实际项目仍会有很有需要优化的地方,仅供参考:
/**
* 连接设备(为了给客官们更详尽的展示,所以把很多变量都写在了方法内,实际项目中很多变量不会在方法内初始化)
* 入参:设备mac地址
* @param mac
*/
private void connectDevice(final String mac){
// 获取蓝牙适配器
BluetoothAdapter bluetoothAdapter = ();
if(bluetoothAdapter == null){
("connectDevice","bluetoothAdapter is null");
return;
}
// 根据mac地址获取蓝牙设备实例对象,当然此处的bluetoothDevice也可以通过蓝牙扫描得到
BluetoothDevice bluetoothDevice = (mac);
if(bluetoothDevice == null){
("connectDevice","this device is not exist");
return;
}
// 由于今天只讨论蓝牙连接问题,所以这里仅重写了"监测连接状态变化"的方法
gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
(gatt, status, newState);
if(status == 0){ //表示gatt服务成功
if(newState == BluetoothProfile.STATE_CONNECTED){ // 连接成功状态
//连接成功之后的操作
}else if(newState == BluetoothProfile.STATE_DISCONNECTED){ // 断开连接状态
//断开连接之后的操作
}
}else {
();
();
if(status == 133){ //经典错误:133
//提示:此处我们可以根据全局的一个flag,去重试连接一次,以增大连接成功率
if(!isRetry){
isRetry = true;
connectDevice(mac);
}
}
}
}
};
// gatt为全局变量,获取当前gatt服务下连接的设备
if(gatt != null && () != null){
for(BluetoothDevice device:()){
if(().equals(mac)){ // 如果当前遍历出的连接设备与我们需要连得设备是同一设备
(); //先去断开之前未正常断开的连接,解决连接133的问题
}
}
(); //释放gatt服务
gatt = null;
}
if (.SDK_INT >= Build.VERSION_CODES.M) {
gatt = (,
false, gattCallback, TRANSPORT_LE); //
} else {
gatt = (,
false, gattCallback);
}
}
关于蓝牙连接的问题先告一段落了,后面有时间会继续分享BluetoothGattCallback内的其他方法的作用。也欢迎大家指正以及提出宝贵的意见,互相进步。谢谢~