Android BLE开发断线重连失败的解决方案

Android BLE开发断线重连失败的解决方案

遇到的问题

在进行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);
                
				 }
              
			 }

		 }
	};
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值