まえがき
AOSP(Android Open Source Project)へのBluetooth関連のコミットを見ていたら
Androidの公式ドキュメントには記載されていないAndroid 8.1のBluetoothの動作を見つけたので紹介します。
スクリーンオフ中はフィルタ無しのBLEスキャンが停止する
AOSPへのコミット
コミットの内容
スクリーンがオフになった時にフィルタ無しのBLEスキャンが停止します。
スクリーンオンになるとBLEスキャンが再開しアプリケーションにスキャン結果が通知されます。
スクリーンオフ中もフィルタ無しBLEスキャンを開始することは出来ますが、スキャン結果が
アプリケーションに通知されるのは次回スクリーンオン時以降になります。
回避方法
BLEスキャンをかける時は、適切なフィルタを設定しましょう。
一部の古いAndroid端末では不具合によりBLEスキャンフィルタが機能しない機種があったため
スキャンフィルタを使わない実装をしている方は注意してください。
スキャンフィルタはBluetoothのチップで処理しているため、Bluetoothスタック等の相性により
以前はうまく動かないケースが過去にありました。
8.1以降に対応するAndroid端末ではさすがに解消されている可能性が高いので
スキャンフィルタを使う実装を行っても問題ないかと思います。
アプリがバックグラウンドになるとBLEスキャンモードが省電力モードになる
AOSPへのコミット
コミットの内容
アプリがバックグラウンド(non-foreground state)になるとBLEスキャンモードが
SCAN_MODE_LOW_POWERになります。SCAN_MODE_BALANCED、SCAN_MODE_LOW_LATENCYを想定した実装をしている方は注意してください。バックグラウンドになると勝手にBLEスキャン結果の通知が遅くなります。
回避方法
調査中です。フォアグラウンドサービスでスキャンしておくと良さそう??
おわりに
Android Marshmallowで入ったDoze機能、さらにNougatで入ったDeep-Doze、
Oreoではバックグラウンドの実行制限、位置情報の制限など、省電力に関する機能が色々とはいっています。
上記のコミットもその省電力対応の一貫と思われますが、開発者としては公式ドキュメントに注意点として
記載しておいて頂けると大変助かるなー、と思いました。