Pracuję nad aplikacją, w której mogę zarówno znaleźć, jak i skonfigurować urządzenia BLE. Używam standardowego interfejsu API systemu Android BLE, ale ostatnio napotkałem na pewne dziwne problemy.Android przestaje znajdować urządzenia BLE: onClientRegistered() - status = 133 clientIf = 0
Po włączeniu aplikacji skanowanie BLE działa poprawnie. Mam skanowanie przy użyciu:
mBluetoothAdapter.startLeScan(mLeScanCallback); // for Kitkat and below
i
mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above
W logcat ja dostaję następujące komunikaty (myślę, że to jest ważne dla tego wydania)
D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5
W moim app może również odczytać pewne cechy z moich urządzeń BLE (np. stan baterii). Łączę się z urządzeniem, aby odczytać tę charakterystykę w oddzielnym fragmencie, stosując:
mBluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = mBluetoothManager.getAdapter();
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress);
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback);
Charakterystyki są odczytywane poprawnie. W onCharacteristicRead
zwrotnego ja też odłączyć i ścisłej Gatt:
mBluetoothGatt.disconnect();
mBluetoothGatt.close();
każdym razem otworzyć fragment czytać charakterystyczny (bez względu na to czy jest to to samo urządzenie, czy nie) clientIf
zwiększa wartość. Widzę w LogCat:
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=6
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=7
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=8
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=9
D/BluetoothGatt: onClientRegistered() - status=0 clientIf=10
Wszystko działa dobrze, dopóki wartość clientIf
równa 10. BLE skanowanie zatrzymuje znalezienie żadnych urządzeń, nie mogę połączyć się z żadnym z moich urządzeń czytać żadnych cech itp a logcat wyświetlacze nieskończenie tych komunikatów:
D/BluetoothGatt: unregisterApp() - mClientIf=0
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0
jedynym sposobem, aby naprawić to, aby zabić aplikację i ponownie ją uruchomić ponownie lub Bluetooth, obracając ją i wyłączać ręcznie. Napotkano ten problem tylko na niektórych urządzeniach, takich jak Xperia Z1 (Android KitKat) i Galaxy S4 (Android Lollipop). Nie mogłem odtworzyć tego problemu na Xperia Z3 Compact z systemem Android Marshmallow ...
Czy mogę coś z tym zrobić? Próbowałem już wielu "rozwiązań", takich jak: wywoływanie wszystkich metod BLE z wątku UI i zamykanie/rozłączanie GATT, ale nic nie pomaga. Jak mogę to naprawić?
miałem podobny problem i dla mnie dodając trochę opóźnienie pomiędzy rozłączeniem i skanowanie rozwiązany problem też. Dzięki! – Tijn
Znalazłem to samo rozwiązanie, co ty. Szczegóły: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –