2016-09-22 3 views
9

Ich entwickle eine App, in der ich BLE-Geräte finden und konfigurieren kann. Ich benutze Standard Android BLE API, aber vor kurzem habe ich einige seltsame Probleme festgestellt.Android stoppt die Suche nach BLE-Geräten: onClientRegistered() - status = 133 clientIf = 0

Wenn ich meine App einschalte, funktioniert der BLE-Scan einwandfrei. Ich Scannen mit:

mBluetoothAdapter.startLeScan(mLeScanCallback); // for Kitkat and below 

und

mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above 

Im Logcat ich folgende Meldungen bin immer (ich denke, das für dieses Thema wichtig ist):

D/BluetoothAdapter: onClientRegistered() - status=0 clientIf=5 

In meiner app I kann auch bestimmte Eigenschaften von meinen BLE-Geräten lesen (zB Batteriezustand). Ich verbinde mich mit einem Gerät, um dieses Merkmal in einem separaten Fragment zu lesen mit:

mBluetoothManager = (BluetoothManager) mContext.getSystemService(Context.BLUETOOTH_SERVICE); 
mBluetoothAdapter = mBluetoothManager.getAdapter(); 
mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(mMacAddress); 
mBluetoothGatt = mBluetoothDevice.connectGatt(mContext, false, mGattCallback); 

Die Merkmale werden korrekt gelesen. Im onCharacteristicRead Rückruf auch und Schließen Gatt I trennen:

mBluetoothGatt.disconnect(); 
mBluetoothGatt.close(); 

Jedes Mal, wenn ich ein Fragment öffne eine Charakteristik (egal, ob es das gleiche Gerät ist oder nicht) zu lesen clientIf Wert steigt. Ich kann in der LogCat sehen:

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 

Alles funktioniert gut, bis der clientIf Wert gleich 10. BLE Scan stoppt alle Geräte zu finden, kann ich nicht zu einem meiner Geräte verbinden alle Eigenschaften zu lesen, etc. Und die LogCat unendlich zeigt diese Meldungen:

D/BluetoothGatt: unregisterApp() - mClientIf=0 
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0 

Der einzige Weg, um es zu beheben ist die App zu töten und starten sie es oder Bluetooth neu starten, indem sie es aus und manuell drehen. Ich habe dieses Problem nur bei bestimmten Geräten wie Xperia Z1 (Android KitKat) und Galaxy S4 (Android Lollipop) festgestellt. Ich konnte dieses Problem nicht auf dem Xperia Z3 Compact mit Android Marshmallow reproduzieren ...

Kann ich irgendetwas dagegen tun? Ich habe bereits mehrere "Lösungen" ausprobiert, wie zum Beispiel: - Aufruf aller BLE-Methoden über den UI-Thread und Schließen/Trennen des GATT, aber nichts hilft. Wie kann ich es reparieren?

Antwort

8

Ich werde meine eigene Frage beantworten, denn wahrscheinlich wird es jemandem mit dem gleichen Problem helfen.

Zunächst konnte ich das Problem mit Bluetooth Absturz nicht beheben, nachdem mClientIf Wert 10 erreicht erreicht. Allerdings habe ich einen Workaround gefunden, der in meinem Fall geholfen hat.

Auch wenn ich Leuchtfeuer-Suche in den ersten Fragment und Startcharakteristik Lese in einem anderen anhielt, offenbar BLE API nicht stoppen die Suche sofort und nach den nächsten Fragment dem System Öffnen einer anderen „Client“ wurde zu schaffen.

Deshalb muss ich einige Zeit nach dem Verlassen der ersten Fragment warten und bevor Sie beginnen, das Merkmal in einem anderen zu lesen.

Diese Methode wird in onCreateView der „neuen“ Fragment (mit postDelayed hat mir geholfen, das Problem zu beheben) genannt:

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

ich ein ähnliches Problem hatte und für mich ein wenig Verzögerung zwischen trennen das Hinzufügen und gelöst Scan das Problem auch. Vielen Dank! – Tijn

+0

Ich habe die gleiche Lösung wie Sie gefunden. Details: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

Das Schließen des Gatt-Objekts ist der richtige Weg, um die Ressourcen freizugeben. Wenn es immer noch nicht funktioniert, gibt es einen Fehler in Android auf diesem bestimmten Telefon.

Um die Möglichkeit zu minimieren, das Limit zu erreichen, können Sie sicherstellen, dass Sie nie mehr als ein Gatt-Objekt pro Gerät haben.

Verwandte Themen