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

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

動画

サンプル