遇到的问题
在进行Android BLE开发时,项目需要根据保存的蓝牙地址做到自动连接的效果。但是在开关蓝牙之后,蓝牙就始终连接不上。这是日志出现:
onClientConnectionState() - status=133 clientIf=5 device=地址
根据文章https://blog.csdn.net/langlitaojin/article/details/88360521里的解释是,在BluetoothGatt发生状态改变的时候,需要及时关闭BluetoothGatt的连接,并且释放BluetoothGatt。
BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
//连接状态变化的回调
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
super.onConnectionStateChange(gatt, status, newState);
Log.i(TAG, "连接状态:status:" + status + ",newState:" + newState)
if (status == BluetoothGatt.GATT_SUCCESS) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
//连接成功,调用发现服务的方法
gatt.discoverServices();
mHandler.sendEmptyMessage(STATE_CONNECTED);
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
Log.i(TAG, "断开连接");
mHandler.sendEmptyMessage(STATE_DISCONNECT);
gatt.disconnect();
gatt.close();
}
} else {
Log.i(TAG, "连接失败");
gatt.close();
}
}
}
————————————————
版权声明:本文为CSDN博主「铁掌码上飘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/langlitaojin/article/details/88360521
经过测试还是没有解决蓝牙重连失败的问题。
在连接时先进行扫描
后面根据https://blog.csdn.net/RingoPaul/article/details/52848243,连接前先进行蓝牙扫描之后可以解决重连问题。 根据测试后达到了断线重连的效果,连接后需及时关闭扫描避免资源的浪费。
// gatt为全局变量,获取当前gatt服务下连接的设备
if(connectDevice != null ){
connectDevice.disconnect(); `//先去断开之前未正常断开的连接,解决连接133的问题
connectDevice.close(); //释放gatt服务
connectDevice = null;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//连接前先进行扫描
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
btAdpater.startLeScan(leScanCallback);
} else {//安卓6.0及以上的方案
scanner = btAdpater.getBluetoothLeScanner();
scanner.startScan(scanCallback);
}
private android.bluetooth.BluetoothAdapter.LeScanCallback leScanCallback =new BluetoothAdapter.LeScanCallback(){
@Override
public void onLeScan(BluetoothDevice bluetoothDevice, int i, byte[] bytes) {
if (bluetoothDevice.getAddress().equals(config.mac)){
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.M) {
connectDevice = bluetoothDevice.connectGatt(context, false, gattcallback,BluetoothDevice.TRANSPORT_LE);
btAdpater.stopLeScan(leScanCallback);
} else {
connectDevice = bluetoothDevice.connectGatt(context, false, gattcallback);
btAdpater.stopLeScan(leScanCallback);
}
}
}
};
private ScanCallback scanCallback=new ScanCallback() {
@Override
public void onScanResult(int callbackType, ScanResult result) {
super.onScanResult(callbackType, result);
if (Build.VERSION.SDK_INT>= Build.VERSION_CODES.M) {
if (result.getDevice().getAddress().equals(config.mac)){
connectDevice = result.getDevice().connectGatt(context, false, gattcallback,BluetoothDevice.TRANSPORT_LE);
scanner.stopScan(scanCallback);
}
}
}
};