2016-09-22 3 views
9

Je développe une application dans laquelle je peux à la fois trouver et configurer des périphériques BLE. J'utilise l'API standard Android BLE, mais récemment j'ai rencontré des problèmes étranges.Android arrête de trouver des périphériques BLE: onClientRegistered() - status = 133 clientIf = 0

Lorsque j'allume mon application, le scan BLE fonctionne correctement. Je numérisation à l'aide:

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

et

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

Dans le Logcat Je reçois des messages suivants (je suppose que cela est important pour cette question):

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

Dans mon application I peut également lire certaines caractéristiques de mes appareils BLE (par exemple l'état de la batterie). Je me connecte à un périphérique pour lire cette caractéristique dans un fragment séparé en utilisant:

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

Les caractéristiques sont lues correctement. Dans le rappel onCharacteristicRead je déconnecte également tout près Gatt:

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

Chaque fois ouvrir un fragment de lire une caractéristique (peu importe que ce soit le même dispositif ou non) clientIf valeur augmente. Je peux voir dans le 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 

Tout fonctionne bien jusqu'à ce que la valeur est égale à 10. clientIf analyse BLE cesse de trouver tous les périphériques, je ne peux pas se connecter à l'un de mes appareils de lecture des caractéristiques, etc. Et le LogCat infiniment affiche ces messages:

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

la seule façon de résoudre ce problème est de tuer l'application et relancer ou redémarrer Bluetooth en l'éteignant et manuellement. J'ai rencontré ce problème uniquement sur certains appareils tels que Xperia Z1 (Android KitKat) et Galaxy S4 (Android Lollipop). Je ne pouvais pas reproduire ce problème sur Xperia Z3 Compact exécutant Android Marshmallow ...

Y at-il quelque chose que je peux faire à ce sujet? J'ai déjà essayé plusieurs "solutions" telles que - appeler toutes les méthodes BLE du thread UI et fermer/déconnecter le GATT, mais rien n'y fait. Comment puis-je le réparer?

Répondre

8

Je vais répondre à ma propre question, car il va probablement aider quelqu'un avec le même problème.

Tout d'abord, je ne pouvais pas résoudre le problème avec Bluetooth se briser après mClientIf valeur atteint 10. Cependant, j'ai trouvé une solution de contournement qui a aidé dans mon cas.

Même si j'arrêtais la recherche de balise dans la première Fragment et à partir de lecture caractéristique dans une autre, API BLE apparemment n'a pas empêché la recherche immédiatement et après l'ouverture de la prochaine Fragment le système a été crée un autre « client ».

C'est pourquoi j'ai besoin d'attendre un certain temps après avoir quitté le premier Fragment et avant de commencer à lire la caractéristique dans un autre.

Cette méthode est appelée à onCreateView de la « nouvelle » Fragment (en utilisant postDelayed m'a aidé à résoudre le problème):

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

J'ai eu un problème similaire et pour moi d'ajouter un peu de retard entre déconnexion et numérisez résolu le problème aussi. Merci! – Tijn

+0

J'ai découvert la même solution que vous. Détails: https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

La fermeture de l'objet gatt est la manière correcte de libérer les ressources. Si cela ne fonctionne toujours pas, il y a un bug dans Android sur ce téléphone particulier. Pour minimiser les risques d'atteindre la limite, vous pouvez vous assurer de ne jamais avoir plus d'un objet gatt par périphérique.