BLEデバイスの検索と構成の両方ができるアプリを開発しています。標準のAndroid BLE APIを使用していますが、最近、いくつかの奇妙な問題が発生しました。
アプリをオンにすると、BLEスキャンは正常に機能します。私は以下を使用してスキャンしています:
mBluetoothAdapter.startLeScan(mLeScanCallback); // for KitKat and below
そして
mBluetoothAdapter.getBluetoothLeScanner().startScan(mScanCallback); // for Lollipop and above
Logcatで、次のメッセージが表示されます(これはこの問題にとって重要だと思います)。
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
コールバックでは、Gattも切断して閉じます。
mBluetoothGatt.disconnect();
mBluetoothGatt.close();
フラグメントを開いて特性を読み取るたびに(同じデバイスであるかどうかに関係なく)、clientIf
値が増加します。 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
clientIf
の値が10になるまで、すべて正常に動作します。BLEスキャンでデバイスの検出が停止し、デバイスに接続して特性などを読み取ることができません。LogCatは次のメッセージを無限に表示します。
D/BluetoothGatt: unregisterApp() - mClientIf=0
D/BluetoothGatt: onClientRegistered() - status=133 clientIf=0
これを修正する唯一の方法は、アプリを強制終了して再起動するか、Bluetoothを手動でオフにしてから再起動することです。この問題は、Xperia Z1(Android KitKat)やGalaxy S4(Android Lollipop)などの特定のデバイスでのみ発生しました。 Xperia Z3Compactを実行しているAndroid Marshmallow .. ..
それについて私にできることはありますか? UIスレッドからすべてのBLEメソッドを呼び出したり、GATTを閉じたり切断したりするなど、複数の「解決策」をすでに試しましたが、何も役に立ちません。どうすれば修正できますか?
Gattオブジェクトを閉じることは、リソースを解放する正しい方法です。それでも機能しない場合は、その特定の電話のAndroidにバグがあります。
制限に達する可能性を最小限に抑えるために、デバイスごとに複数のガットオブジェクトがないことを確認できます。