バックグラウンド位置情報の制限

Android 8.0(API レベル 26)では、消費電力を削減するため、アプリがバックグラウンドで実行されているときにアプリがユーザーの現在地を取得できる頻度が制限されています。このような状況では、アプリが位置情報の更新を受信できるのは 1 時間に数回のみです。

注: これらの制限は、アプリのターゲット SDK バージョンに関係なく、Android 8.0(API レベル 26)以降を搭載しているデバイスで使用されるすべてのアプリに適用されます。

アプリがバックグラウンドでの実行中にリアルタイムのアラートやモーション検出に依存している場合は、この位置情報取得動作に特に注意する必要があります。

フォアグラウンド アプリの動作が保持される

Android 8.0(API レベル 26)を搭載しているデバイスでアプリがフォアグラウンドにある場合、位置情報の更新動作は Android 7.1.1(API レベル 25)以前と同じです。

警告: アプリが準リアルタイムの位置情報の更新を長期間にわたって取得している場合、デバイスのバッテリー駆動時間が大幅に短くなります。

アプリの位置情報動作を調整する

アプリが位置情報の更新を頻繁に受信しない場合、バックグラウンドで実行するアプリのユースケースが成功しないかどうかを検討してください。その場合は、次のいずれかのアクションを実行することで、位置情報の更新をより高い頻度で取得できます。

  • アプリをフォアグラウンドで操作します。
  • startForegroundService() を呼び出して、アプリでフォアグラウンド サービスを開始します。このようなフォアグラウンド サービスがアクティブになると、通知エリアに進行中の通知が表示されます。

    注意: Android 11(API レベル 30)以降を搭載したデバイスでバックグラウンドで実行されているアプリがフォアグラウンド サービスを開始する場合、ユーザーがアプリに ACCESS_BACKGROUND_LOCATION 権限を付与しない限り、アプリは位置情報にアクセスできません。詳しくは、フォアグラウンド サービスに関連付けられている使用中の制限についてのガイダンスをご覧ください。

  • 消費電力を最小限に抑えるために最適化された Geofencing API の要素(GeofencingClient など)を使用します。
  • パッシブな位置情報リスナーを使用します。フォアグラウンド アプリがより速い頻度で位置情報の更新をリクエストする場合は、位置情報の更新をより速く受け取ることができます。

注: アプリが頻繁に更新される位置情報履歴にアクセスする必要がある場合は、FusedLocationProviderApi インターフェースなど、Fused Location Provider API 要素のバッチ バージョンを使用してください。アプリがバックグラウンドで実行されている場合、この API は非バッチ API よりも頻繁にユーザーの位置情報を受け取ります。ただし、アプリは 1 時間に数回しか更新をバッチで受信しないことに注意してください。

影響を受ける API

バックグラウンド アプリの位置情報取得動作の変更は、次の API に影響します。

Fused Location Provider(FLP)
  • アプリがバックグラウンドで実行されている場合、位置情報サービスは 1 時間に数回だけアプリの新しい位置情報を計算します。これは、アプリがより頻繁に位置情報の更新をリクエストする場合でも同様です。

    ただし、FLP の バッチ バージョンを使用すると、1 時間に数回しか発生しないバッチ アップデートをアプリが受信した後でも、より頻繁に位置情報の履歴にアクセスできます。

  • アプリがフォアグラウンドで実行されている場合は、Android 7.1.1(API レベル 25)から位置情報のサンプリング レートに変更はありません。
ジオフェンス
  • バックグラウンド アプリは、Fused Location Provider からの更新よりも高い頻度でジオフェンス移行イベントを受信できます。
  • ジオフェンス イベントの平均応答性は数分ごとです。
GNSS Measurements と GNSS Navigation Message
  • アプリがバックグラウンドで動作しているとき、GnssMeasurementGnssNavigationMessage からの出力を受け取るように登録されているコールバックは実行を停止します。
Location Manager
  • 位置情報の更新データがバックグラウンド アプリに提供されるのは、1 時間に数回のみです。

    注: Google Play 開発者サービスがインストールされているデバイスでアプリを実行している場合は、代わりに Fused Location Provider(FLP)を使用することを強くおすすめします。

Wi-Fi Manager
startScan() メソッドは、バックグラウンド アプリのフルスキャンを 1 時間に数回だけ実行します。バックグラウンド アプリがこのメソッドを再度呼び出すと、WifiManager クラスは前回のスキャンでキャッシュされた結果を提供します。