web-dev-qa-db-ja.com

画面がオフのときにBLEスキャンが機能しないAndroid 8.1.0

最新のAndroid 8.1.0アップデートでピクセルを使用しています。

BLE広告スキャンに関連する問題に直面しています。画面をオフにすると(電源ボタンを押すと)、スキャンが停止します。画面をオンにするとすぐに再起動します。

BLEの最新コードを確認しました。 googleはこの機能を新たに導入しました( 参照リンク )。

この部分をスキップする方法はありますか、つまり、画面のオン/オフに関係なくスキャンを停止しないでください。

20
Parth

Android 8.1、unfiltered画面をオフにすると、Bluetoothスキャンがブロックされます。このような劇的な変更が行われるのは驚くべきことですAndroidのマイナーリリースでは、これは確かにコミットのコメントに基づいた意図的な変更です。 画面が消えたときにフィルター処理されていないBLEスキャンを停止します。

回避策は、すべてのスキャンでScanFilterを使用することです。新しい8.1オペレーティングシステムコードは、画面がオフのときにアクティブなスキャンに少なくとも1つのスキャンフィルターがあることを確認するだけです。これらの条件が満たされている場合、スキャン結果はAndroid 8.0.x以前のように配信されます。

このようなスキャンを設定するには、Android 5.0で導入されたAPIを使用し、各スキャンでScanFilterを作成する必要があります。以下は、メーカーの広告を検索するフィルターですAppleメーカーID 0x004cのデバイス(これにはiBeaconsが含まれます):

ScanFilter.Builder builder = new ScanFilter.Builder();
builder.setManufacturerData(0x004c, new byte[] {});
ScanFilter filter = builder.build();

同様に、GATTサービス広告(Eddystoneビーコンで使用される種類など)に興味がある場合は、次のようなフィルターでGATTサービスUUIDを検索できます。

ScanFilter.Builder builder = new ScanFilter.Builder();
String serviceUuidString = "0000feaa-0000-1000-8000-00805f9b34fb";
String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
ParcelUuid parcelUuid = ParcelUuid.fromString(serviceUuidString);
ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
builder.setServiceUuid(parcelUuid, parcelUuidMask);
ScanFilter filter = builder.build();

必要に応じて、単一のスキャンに複数のフィルターを追加できます。一致するものはすべて結果を返します。ここでの唯一の本当の制限は、少なくとも画面をオフにしてスキャンする場合、事前に一致する可能性のあるすべてのメーカーコードまたはすべてのGATTサービスUUIDを知っている必要があることです。

次のようなコードでスキャンを開始します。

bluetoothAdapter.getBluetoothLeScanner().startScan(filters, settings, scanCallback);

EDIT:emptyScanFilterでこれを行うことも可能ですこのような:

ScanFilter.Builder builder = new ScanFilter.Builder();
ScanFilter filter = builder.build();

このようなスキャンフィルターを使用すると、すべての広告パケットと一致しますが、Android 8.1で画面をオフにしたまま、実質的に同じ動作をAndroid 8.0.x以前。

EDIT 2:Galaxy Note 9でAndroid 8.1およびおそらく8.1の他のSamsungデバイスでは、スキャンは空のスキャンフィルターを使用しても画面がオフになる上記のように、空でないスキャンフィルターを使用して画面をオフにしてスキャンを実行できます。

33
davidgyoung

私は同じ問題に直面しました。画面がロックされていてもBLEデバイスをスキャンするために、スキャンフィルターがありました。しかし、Samsungデバイスでは機能しなかったため、Samsungフォーラムで検索し、Knox SDKを発見しました( https://seap.samsung.com/sdk/knox-Android )。

そして、それは私の問題の解決策でした。必要なことは、アプリに追加してライセンスを作成し、アクティベートし、最後にこのメソッドaddPackageToBatteryOptimizationWhiteListを使用して、Samsungデバイスの画面がロックされているときにスキャンをロック解除することだけです。

1
yozzy

彼らが何かを見逃さない限り、明らかにそうではありません。ただし、スキャンフィルターがある場合は、バックグラウンドで動作します。スキャンフィルターを使用する必要があります。それは本当に問題ですか?

1
Emil