Android BLE:成功将ENABLE_NOTIFICATION_VALUE值写入BluetoothGattDescriptor,但onCharacteristicChanged永远不会触发

时间:2017-07-22 01:12:36

标签: android bluetooth-lowenergy android-6.0-marshmallow android-bluetooth bluetooth-gatt

我有一个BLE外围设备,可以在iOS和Android 7.0上使用给定的服务/特性UUID。在Android 6.0 Marshmallow上,尽管在描述符上设置了ENABLE_NOTIFICATION_VALUE,onCharacteristicChanged方法也不会触发。请帮我弄清楚如何让运行Android OS 6.0 Marshmallow的Android设备启动onCharacteristicChanged。以下是我尝试使用通知的代码:

    boolean success = mBluetoothGatt.setCharacteristicNotification(characteristic, true);
    Log.e(TAG, "set char notification = " + (success ? "It worked :)" : "It did not work :("));

    if (UUID_DATA_PACKET.equals(characteristic.getUuid())) {
        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                UUID.fromString(EkoCoreGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));

        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);

        success = mBluetoothGatt.writeDescriptor(descriptor);
        Log.e(TAG, "set descriptor = " + descriptor.getCharacteristic().getWriteType() + ", success = " + (success ? "It worked :)" : "It did not work :("));
    }

在上面的代码中,setCharacteristicNotification和writeDescriptor调用都返回成功(1 / true / etc)。此外,onDescriptorWrite回调返回GATT_SUCCESS。但是,当我们在代码中稍后读取描述符时,发现通知值仍设置为禁用。我们已经尝试了许多解决方案,例如在setCharacteristicNotification和writeDescriptor调用之间设置延迟,但是没有找到解决此问题的方法。与相关外围设备配对没有问题,但获取通知似乎有点不可能。任何提示将不胜感激。

1 个答案:

答案 0 :(得分:0)

在编写描述符之前添加以下内容修复了我的问题:

characteristic.setWriteType(BluetoothGattCharacteristic.WRIT‌​E_TYPE_DEFAULT);

显然Android 6中存在一些错误。我希望这个答案可以帮助其他人。很难找到。