Android BluetoothGatt не получает уведомления о характеристиках BluetoothGatt#writeDescriptor(desc) возвращает false

Я работаю над приложением, которое должно взаимодействовать с устройством Bluetooth LE.

Это код, который я использую для установки CharacteristicNotification

public boolean setCharacteristicNotification(
    BluetoothGattCharacteristic characteristic, boolean enable) {

if(mBluetoothAdapter == null || mBluetoothGatt == null) {
    Log.w(TAG, "BluetoothAdapter not initialized");
    return false;
}

Log.v(TAG, "setCharacteristicNotification(): uuid=" + characteristic.getUuid() + " enabled=" + enable);

boolean notifications = mBluetoothGatt.setCharacteristicNotification(characteristic, enable);

if(notifications) {
    Log.v(TAG, "setCharacteristicNotification(): Notifications are enabled");
}
else {
    Log.w(TAG, "setCharacteristicNotification(): Notifications are not enabled for characteristic " + characteristic);
}

BluetoothGattDescriptor desc = characteristic.getDescriptor(
        UUID.fromString(FBGattAttributes.CHARACTERISTIC_CLIENT_CONFIG));

desc.setValue(enable ?
                BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE :
                new byte[]{0x00, 0x00}
);

boolean ok = mBluetoothGatt.writeDescriptor(desc);

if(ok){
    Log.v(TAG, "wrote descriptor value for notification: ok=" + ok);
}else{
    Log.w(TAG, "writeDescriptor failed: we will not get notifications=" + ok);
}


return ok;
}

Вот в этом коде "mBluetoothGatt.writeDescriptor(desc);" иногда возвращает false, поэтому я не могу получать уведомления от BluetoothGatt. Я не уверен, как решить эту проблему.

Эта проблема была только на LG G2 с ОС 5.02, до этого была 4.4 Проблема была не так часто, но после обновления у меня каждый раз получалось "false", кроме первого раза. Если мы попытаемся установить уведомления в первый раз после подключения, оно сработает, и как только я отключусь и попытаюсь подключиться, оно всегда будет возвращать False. Мне нужно убить и перезапустить приложение, чтобы оно снова заработало. Кто-нибудь знает, почему это не работает? заранее спасибо


person Varun Narisetty    schedule 24.06.2015    source источник
comment
Вы можете обратиться к этому здесь   -  person Bilal Ahmed    schedule 11.05.2017


Ответы (1)


В Lollypop BluetoothGatt.java был обновлен, чтобы включить блоки «устройство занято», которые предотвращают одновременный запрос нескольких асинхронных операций приложением. См. BluetoothGatt.java:1029. для того, который возвращается из writeDescriptor.

Мне пришлось настроить очередь команд, чтобы обойти это. По сути, моя логика ставит в очередь любые неудачные асинхронные вызовы и выполняет повторные попытки в моем BluetoothGattCallback.

person 32bits    schedule 28.07.2015
comment
Привет. Можете ли вы подробнее объяснить свое решение? - person aclowkay; 26.11.2016