2016-09-22 17 views
9

私はBLEデバイスを見つけて設定することができるアプリを開発しています。私は標準のAndroid BLE APIを使用していますが、最近私はいくつかの奇妙な問題に遭遇しました。AndroidはBLEデバイスの検索を停止します:onClientRegistered() - status = 133 clientIf = 0

私のアプリをオンにすると、BLEスキャンは正常に機能します。

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

と、私は次のメッセージを取得していますLogcat(私はこれが、この問題のために重要であると思います)で

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

:私のアプリのIで

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

を私が使用してスキャンしています私のBLEデバイス(例えば、バッテリー状態)から特定の特性を読み取ることもできます。別の断片でこの特性を読み取るデバイスに接続します。

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

特性が正しく読み込まれています。私はまた、切断および閉じるガットonCharacteristicReadコールバックで:

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

たびI特性(これは同じデバイスであるか否かに関係なく)clientIf値増加を読み取る断片を開きます。私はLogCatで見ることができます:clientIf値は10 BLEスキャンは任意のデバイスを見つけるに停止等しくなるまで

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 

すべてが正常に動作します、私は、任意の特性などを読むために私のデバイスのいずれかに接続し、LogCatすることはできません無限にこれらのメッセージが表示されます。それを修正するために

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

唯一の方法は、アプリを殺すし、それを再起動するか、手動でそれをオフにするとにより、Bluetoothを再起動することです。 Xperia Z1(Android KitKat)やGalaxy S4(Android Lollipop)などの特定のデバイスでのみこの問題が発生しました。私はこの問題をXperia Z3コンパクトAndroid Marshmallowを実行して再現できませんでした...

私はそれについて何かできることはありますか?私はすでに、UIスレッドからすべてのBLEメソッドを呼び出し、GATTを閉じる/切断するなど、複数の "ソリューション"を試しましたが、何も役立たないものです。どうすれば修正できますか?

答えて

8

私は自分の質問に答えるつもりです。これは、それが同じ問題を抱えている人を助けるためです。

まず、mClientIfの値が10に達した後で、Bluetoothのクラッシュに関する問題を解決できませんでした。しかし私は私の場合に役立つ回避策を見つけました。

最初のFragmentでビーコン検索を停止していて、特性を別のもので読み始めているにもかかわらず、BLE APIはすぐに検索を停止せず、次のFragmentを開いた後に別の「クライアント」を作成していました。

これは、最初のFragmentのままにしてから別の特性を読み取る前にしばらく待つ必要があるためです。

この方法は、(問題を解決するために私を助けpostDelayedを使用して)「新」FragmentonCreateViewに呼び出されます。

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

私は同様の問題を持っていたし、私のための切断の間にはほとんど遅延を追加し、解決をスキャン問題も。ありがとう! – Tijn

+0

私はあなたと同じ解決策を見つけました。詳細:https://github.com/googlesamples/android-BluetoothLeGatt/issues/44 –

0

gattオブジェクトを閉じると、リソースを解放する正しい方法です。それでも動作しない場合は、特定の携帯電話のAndroidにバグがあります。

制限に達する機会を最小限に抑えるために、デバイスごとに複数のgattオブジェクトが存在しないようにすることができます。

関連する問題