バックグラウンドでの位置情報の使用に関するベスト プラクティス

このページでは、バックグラウンドでの位置情報の使用権限をリクエストして管理するためのベスト プラクティスについて説明します。

位置情報の利用許可を [常に許可] に設定するようリクエストする

Android 14 以降、アプリがユーザーの位置情報にアクセスするには、ACCESS_BACKGROUND_LOCATION 権限が必要です。Navigation SDK のマニフェスト ファイルにはこの権限が含まれているため、明示的にリクエストする必要はありません(他の目的で必要でない場合)。Gradle マニフェスト マージャーによって、この権限がアプリのマニフェストに統合されます。

ただし、ACCESS_BACKGROUND_LOCATION 権限だけではバックグラウンドで位置情報にアクセスするには不十分です。ユーザーに「常に許可」の位置情報の利用許可をリクエストすることをおすすめします。これにより、アプリがバックグラウンドで実行され、通知が表示されるようになり、ナビゲーション中の位置情報の精度が最大化されます。

このプロンプトでは、権限を付与することで、アプリがバックグラウンドで実行されているときに位置情報の精度が向上し、ナビゲーション エクスペリエンスが向上することをユーザーに説明する必要があります。

権限ダイアログの例

ユーザーに位置情報へのアクセスを求める方法について詳しくは、Android デベロッパー向けドキュメントの位置情報の利用許可をリクエストする | センサーと位置情報 | Android デベロッパーをご覧ください。

ナビゲーション通知が適切にクリーンアップされるようにする

不要になった通知がアプリで保持されないようにするには、次のクリーンアップ手順を実行します。

  • startGuidance() を呼び出した後は、必ず stopGuidance() または clearDestination() を呼び出してください。
  • ArrivalListener を登録したら、必ず登録を解除してください。
  • RoadSnappedLocationProvider を登録した後は、必ず登録を解除してください。

これらの手順を完了すると、不要になった通知が維持されなくなります。これにより、バッテリーの消耗やメモリリークの可能性を回避できます。

NavigationApi#initForegroundServiceManager メソッドを再度呼び出す場合は、まず NavigationApi#clearForegroundServiceManager を呼び出します。

アプリで ForegroundServiceManager を使用している場合は、NavigationApi#initForegroundServiceManagerProvider を呼び出す前に NavigationApi#clearForegroundServiceManager を呼び出します。ForegroundServiceManager をすでに初期化している場合は、NavigationApi#initForegroundServiceManagerMessageAndIntent を呼び出します。この操作は、フォアグラウンド サービス マネージャーを初期化した後に、通知 ID または通知コンテンツを更新するために行います。

Android 14 で導入された新しい制限について

Android 14(Android U)では、バックグラウンドでユーザーの位置情報にアクセスするアプリに新しい制限が導入されました。これらの変更の影響を軽減するため、Navigation SDK のバージョン 5.4.0 では、バックグラウンドでの位置情報へのアクセスをより適切に管理できるように更新されました。また、アプリが引き続き最も正確な位置情報にアクセスできるように、実装を更新することをおすすめします。

Android 14 の変更が Navigation SDK に与える影響

アプリで startGuidance() を呼び出すと、フォアグラウンド サービスがターンバイターン方式のナビのユーザー通知を表示し始めます。ターンバイターン方式のナビは、ルートを更新して正しい視覚的および音声ガイダンスを表示するために、ユーザーの位置情報にアクセスできることが前提となります。Android 14 以降、バックグラウンドでユーザーの正確な位置情報にアクセスするには、ユーザーの許可が必要です。デフォルトでは、アプリがバックグラウンドでの位置情報アクセスのユーザー権限を持たずに、位置情報の更新のためにフォアグラウンド サービスを開始しようとすると、システムは SecurityException をスローし、アプリがクラッシュします。

Navigation SDK がこの問題を軽減する方法

バージョン 5.4.0 以降、Navigation SDK はアプリに影響を与えることなくこの SecurityException を処理し、ナビゲーションをバックグラウンドで継続して実行できるようにします。また、Navigation SDK の AndroidManifest には ACCESS_BACKGROUND_LOCATION 権限が含まれています。この方法では、Gradle のマージによって処理されるため、アプリ自体で権限を宣言する必要はありません。ただし、アプリがバックグラウンドに移行する前に通知がユーザーに表示されない場合、Navigation SDK はシステムに依存して位置情報の更新を提供します。これらのシステム アップデートは頻繁に行われなかったり、正確でなかったりして、ナビゲーション エクスペリエンスが最適化されない可能性があります。このため、バックグラウンドでの位置情報へのアクセスについてもユーザーにプロンプトを表示することをおすすめします。

ナビゲーションの位置情報の精度を向上させるためにアプリ デベロッパーができること

Navigation SDK で使用される位置情報シグナルの精度を向上させるには、バックグラウンドでの位置情報へのアクセスをユーザーに求めるようにアプリを更新します。詳細については、「常に許可」の位置情報の利用許可をリクエストするをご覧ください。