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

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

位置情報へのアクセス権限を [常に許可] に設定するようリクエストする

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 には、AndroidManifestACCESS_BACKGROUND_LOCATION 権限が含まれています。これにより、Gradle マージによって処理されるため、アプリ自体で権限を宣言する必要はありません。ただし、アプリがバックグラウンドに移行する前にユーザーに通知が表示されない場合、Navigation SDK はシステムに依存して位置情報の更新を行います。これらのシステム アップデートは頻繁に行われない場合や、精度が低い場合があり、ナビゲーション エクスペリエンスが最適にならない可能性があります。そのため、ユーザーにバックグラウンドでの位置情報へのアクセスを求めるプロンプトを表示することをおすすめします。

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

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