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

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

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

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 で使用される位置情報シグナルの精度を高めることができます。詳しくは、位置情報の利用許可を [常に許可] に設定するようリクエストするをご覧ください。