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

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

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

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