もう年末ですが、今年とある機能の開発で戦った Android の Geofence について Android Advent Calendar 2022 に書こうと思います。試しに動かすと動いちゃうんですよね。コイツは。でも少し深く掘って見ると様々な障害点が見つかります。
Geofence とは
事前に設定した領域からの出入りをイベントとして処理を行うことができます。
さらに Google Play 開発者サービスを利用の Activity Recognition Transition API を利用すると、行動の様子(歩く・走る・止まる・乗り物)も含めてイベントにすることができます。が、今回は一旦位置情報だけの話。
立ちはだかる壁たち
Geofence を本格的に動かすと様々な問題に出会うことになります。
登録数の上限
登録できる数に上限があります。登録時にエラーが返されます。
単一ユーザー デバイスでは、1 つのアプリで作成できるジオフェンスは 100 個までです。マルチユーザー デバイスでは、1 つのアプリで作成できるジオフェンスはデバイス ユーザーあたり 100 個までです。
いつのまにか消える
「いつのまにか」というのは半分冗談で、ドキュメントを見落としていると何もしてないのに動かなくなります。 必要な場合にのみジオフェンスを再登録する の章を読みましょう。
特にデバイスの再起動は要注意です。 ACTION_BOOT_COMPLETED
を受信して再登録するようにしましょう。
発火しない
GPS 以外にも様々な情報を利用するため、 GPS だけでなくデータ通信が必要です。
Android の OS 設定から、位置情報サービスの設定を確認すると、 GPS 以外にも様々な項目が ON/OFF できることがわかります。特に、領域に入った・出たという情報は、「Google ロケーション履歴」が必要そうです。これらが依存していると考えられるため、モバイルネットワークや Wi-Fi に接続された環境が必要です。
実機を持ち運んでテストするためには基本的には SIM が必要です。
Foreground Service が立ち上がらない
Geofence は、バックグラウンドから Foreground Service を立ち上げることができる例外の一つに指定されていますが、 バッテリーの最適化を無効 にする必要があります。
Exemptions from background start restrictions の The user turns off battery optimizations for your app. は AND 条件です。両方を満たしていないと startForeground
に失敗します。
さらにバッテリーの問題というのは端末の開発側にとってもホットなネタなようで、おそらくメーカーによって様々なカスタマイズが仕組まれています。基本的に
Geofence で Foreground Service を立ち上げる機能を利用する場合は、各メーカーのあらゆる省電力設定はオフにすることになります。
Geofence で立ち上がった Foreground Service で BLE の Scan ができない
さらに Geofence で立ち上がった Foreground Service で BLE の Scan を行いたかったのですが、ここにも制約があります。空の ScanFilter
は画面が消えている状態だと利用できません。何かしら条件を加えましょう。 Service UUID あたりがオーソドックスな方法かと思います。
画面が消えた状態をデバッグしたい
Android には Doze モードという状態があり、その状態になると一部の機能が制限されます。
adb
のコマンドを利用して、端末を強制的に Doze モードにしてデバッグできます。
Google Play の審査
バックグラウンドの位置情報権限には、特殊な申請が必要です。
最初に何もせずにマニフェストファイルに <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
を書くとリジェクトされてメールが来ます。それをよく読んで対処していきましょう。
また、 Play Console の「ポリシー」→「アプリのコンテンツ」中に「機密情報にかかわる権限と API」という項目があります。こちらは Play Console のバックグラウンドでの位置情報のページ の内容をよく読んで記入しましょう。申請を通しに行く作文力が求められます。
まとめ
- https://developer.android.com/ を読み込みましょう
- Play Console のバックグラウンドでの位置情報のページ を読み込みましょう
- 各メーカー・端末の省エネ設定については実機で調べましょう