Android ble设备有时没有断开连接

时间:2016-06-06 09:08:09

标签: android bluetooth-lowenergy

  • 在断开连接设备后,我正在断开连接回调。但是有些时候它还没有断开连接。在一些层连接状态是维护。所以我无法重新连接。

我在android 5& android 6。 在HTC One A9,Moto x play,Moto G4

  • 如果我打开蓝牙,请关闭。然后再次断开回调即将到来,设备实际上正在断开连接。 - 请给出一些解决问题的建议。
  • 我正在执行下面的操作步骤
  • 1.发现设备。
    1. 连接到设备。
    2. onConnectionStateChange(已连接)我正在做gatt.discoverServices()
    3. onServicesDiscovered回调我正在阅读特征 5.onCharacteristicRead回调我正在写写特征。 6.onCharacteristicWrite回调我正在做gatt.disconnect()
    4. onConnectionStateChange(已断开连接)我正在做gatt.close()

在后台设备扫描的这个完整过程中正在进行。

2 个答案:

答案 0 :(得分:3)

这个问题可以通过不调用stopScan()方法来连接。 请参阅SoroushA的评论 Totally Disconnect a Bluetooth Low Energy Device

答案 1 :(得分:2)

您需要确保连接到设备不超过一次。我发现如果不添加自己的保护,您可能会无意中同时与一个设备(即存在多个BluetoothGatt对象)建立多个连接。您可以通过任何这些BluetoothGatt对象与设备通信,因此您不会在此时发现问题。但是当你试图断开连接时(错误地)将连接断开。

要消除此风险,您需要大致如下代码:

BluetoothGatt mBluetoothGatt;
private BluetoothAdapter.LeScanCallback mLeScanCallback = new BluetoothAdapter.LeScanCallback() {
    @Override
    public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {            
        if (device != null) {
            Log.d(TAG, "LeScanCallback!!!!  device " + device.getAddress());

            boolean foundDevice = false;

            if (device.getName() != null) {
                Log.d(TAG, "LeScanCallback!!!!  " + device.getName());
                // Put your logic here!
                if (device.getName().compareTo("YOUR_DEVICE") == 0) {
                    Log.d(TAG, "Found device by name");
                    foundDevice = true;
                }
                else {
                    Log.d(TAG,"Found " + device.getName());
                }
            }

            if(mBluetoothGatt == null && foundDevice) {
                mBluetoothGatt = device.connectGatt(getApplicationContext(), false, mGattCallback);
                // Make sure to handle failure cases in your callback!

                Log.d(TAG, "Stopping scan."); //Appropriate only if you want to find and connect just one device.
                mBluetoothAdapter.stopLeScan(this);
            }
        }
    }
};