2016-09-22 13 views
9

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ć?

Odpowiedz

8

Będę odpowiadać na moje własne pytanie, ponieważ prawdopodobnie pomoże to komuś z tym samym problemem.

Po pierwsze nie mogłem rozwiązać problemu z awarią Bluetooth po osiągnięciu wartości mClientIf osiągniętej wartości: 10. Jednak znalazłem obejście, które pomogło w moim przypadku.

Mimo, że zatrzymywałem wyszukiwanie w beacon w pierwszej Fragment i początkowej charakterystyce odczytanej w innym, BLE API najwyraźniej nie zatrzymało poszukiwań natychmiast i po otwarciu kolejnego Fragment system tworzył kolejnego "klienta".

Dlatego muszę chwilę poczekać po wyjściu z pierwszego Fragment i przed rozpoczęciem czytania charakterystyki w innym.

Metoda ta nazywana jest w onCreateView „nowego” Fragment (używając postDelayed pomógł mi rozwiązać problem):

private void getBatteryCharacteristic() { 
     new Handler(Looper.getMainLooper()).postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       mBeaconBatteryStateReader = new BeaconBatteryStateReader(
         BeaconDetailsActivity.this, 
         mBeacon.getMacAddress()); 
       mBeaconBatteryStateReader.readBatteryState(BeaconDetailsActivity.this); 
      } 
     }, 100); 
    } 
+1

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

+0

Znalazłem to samo rozwiązanie, co ty. Szczegóły: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

Zamknięcie obiektu GAT jest prawidłowym sposobem zwolnienia zasobów. Jeśli nadal nie działa, na tym telefonie występuje błąd w systemie Android.

Aby zminimalizować szansę na osiągnięcie limitu, możesz mieć pewność, że nigdy nie będziesz mieć więcej niż jednego obiektu na każde urządzenie.

Powiązane problemy