Android でユーザーの位置情報をリクエストする方法は複数あり、最適な方法はユースケースによって異なります。このガイドでは、さまざまな位置情報へのアクセス シナリオについて説明し、各ケースで位置情報の利用許可をリクエストする方法について解説します。
まず、 すべての実行時の権限に関するベスト プラクティスと、権限リクエストを 最小限に抑えるための広範なガイダンスを確認してください。
位置情報へのアクセスの種類
各権限は、次の特性の組み合わせで構成されています。
- カテゴリ: フォアグラウンドでの位置情報またはバックグラウンドでの位置情報。
- 精度: 正確な位置情報またはおおよその位置情報。
フォアグラウンドでの位置情報
1 回のみ、あるいは指定した期間にわたって位置情報を共有または受信する機能がアプリに含まれている場合には、フォアグラウンドでの位置情報へのアクセスが必要です。以下はその一例です。
- ナビゲーション アプリで、ターンバイターン方式の経路案内をする機能。
- メッセージング アプリで、ユーザーが現在地を別のユーザーと共有する機能。
アプリの機能が次のいずれかの状況でデバイスの現在地にアクセスする場合、システムはアプリがフォアグラウンドで位置情報を使用しているとみなします。
- アプリに属するアクティビティが可視状態にある。
アプリがフォアグラウンド サービスを実行している。フォアグラウンド サービスが実行されているとき、システムはユーザーに対して常に通知を表示します。ユーザーがデバイスの [ホーム] ボタンを押したり、デバイスのディスプレイをオフにしたりしてアプリがバックグラウンドに移動した場合でも、アプリはアクセス権を保持します。
また、次のコード スニペットに示すように、フォアグラウンド サービス タイプを
locationと宣言する必要があります。Android 10(API レベル 29)以降では、このフォアグラウンド サービス タイプを宣言する必要があります。<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
次のスニペットに示すように、アプリが
ACCESS_COARSE_LOCATION権限またはACCESS_FINE_LOCATION
権限のいずれかをリクエストするときに、フォアグラウンドでの位置情報が必要であることを宣言します。
<manifest ... >
<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
1 回限りのアクセス フォアグラウンドでの位置情報データへのアクセスに加えて、アプリの使用中に常に更新するのではなく、アプリの操作の特定の時点でユーザーの位置情報にのみアクセスする必要があるという区別もあります。このような場合、アプリは位置情報 ボタンを使用して 、アプリの使用の個々のセッションの位置情報へのアクセスをリクエストする必要があります。また、アプリが Android 17(API レベル 37)以降をターゲットとしており、セッションベースの位置情報へのアクセスを必要とする機能のみが含まれている場合、Google Play のポリシーでは位置情報ボタンを使用する必要があります。詳しくは、位置情報ボタン ポリシーをご覧ください。
バックグラウンドでの位置情報
アプリ内の機能が 常に他のユーザーと位置情報を共有する場合や、Geofencing API を使用する場合、アプリはバックグラウンドでの位置情報へのアクセスを必要とします。 以下はその一例です。
- 家族間位置情報共有アプリで、家族と位置情報を継続的に共有する機能。
- IoT アプリで、ユーザーが自宅を離れるとオフになり、帰宅すると再びオンになるようにホームデバイスを設定する機能。
フォアグラウンドでの位置情報のセクションで説明した以外の状況で、アプリが デバイスの現在地にアクセスする場合、システムはアプリがバックグラウンドで位置情報を使用しているとみなします。バックグラウンドでの位置情報の精度は、 フォアグラウンドでの位置情報の精度と同じであり、アプリが宣言する位置情報へのアクセス によって異なります。
Android 10(API レベル 29)以降では、実行時に
バックグラウンドでの位置情報へのアクセスをリクエストするために、アプリのマニフェストで
ACCESS_BACKGROUND_LOCATION権限を宣言する必要があります。以前のバージョンの Android では、アプリがフォアグラウンドでの位置情報へのアクセスを取得すると、バックグラウンドでの位置情報へのアクセスも自動的に取得します。
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
精度
Android は、次のレベルの位置情報の精度をサポートしています。
- おおよそ
- デバイスの位置情報の推定値を提供します。この位置情報の推定値が
LocationManagerServiceまたはFusedLocationProviderから取得されている場合、この 推定値の精度は約 3 平方キロメートル(約 1.2 平方 マイル)以内になります。`ACCESS_FINE_LOCATION` 権限ではなく、`ACCESS_COARSE_LOCATION` 権限を宣言すると、アプリはこの精度の位置情報を取得できます。 - 正確
- デバイスの位置情報を可能な限り正確に示します。
位置情報の推定値が
LocationManagerServiceまたはFusedLocationProviderから取得されている場合、通常、その推定値の精度は約 50 メートル(160 フィート)以内になります(誤差は数メートル(10 フィート)以内になることもあります)。ACCESS_FINE_LOCATION権限を宣言すると、アプリはこの精度の位置情報を取得できます。
ユーザーがおおよその位置情報の利用を許可した場合、アプリは おおよその位置情報にのみアクセスできます。アプリが宣言した位置情報の利用許可にかかわらず
ユーザーがおおよその位置情報の利用のみを許可した場合でも、アプリは機能します。アプリの機能が、正確な位置情報にアクセスすることが必要不可欠になった場合は、ACCESS_FINE_LOCATION 権限を使用して、アプリに正確な位置情報へのアクセスを許可するようユーザーに求めることができます。
バックグラウンドでの位置情報の許可に関するリマインダー
Android 10(API レベル 29)以降では、ユーザーがバックグラウンドでの位置情報へのアクセスを許可した後、アプリの機能がバックグラウンドでデバイスの位置情報に初めてアクセスすると、システムがユーザーへの通知の送信をスケジュールします。この通知は、デバイスの位置情報への常時アクセスをアプリに許可したことをユーザーに通知するものです。通知の例を図 8 に示します。
アプリの SDK の依存関係における位置情報の要件を確認する
アプリで位置情報の利用許可(特に ACCESS_FINE_LOCATION の権限)に依存する SDK を使用しているかどうかを確認します。詳しくは、Medium のブログ投稿、SDK の依存関係の
動作を把握するをご覧ください。
参考情報
Android の位置情報へのアクセスについて詳しくは、以下の資料をご覧ください。
Codelab
動画
サンプル
- サンプルアプリ 位置情報の利用許可の使い方を説明します。