位置情報へのアクセスをリクエストする

位置情報サービスを使用するアプリは、ユーザーのプライバシーを保護するために、位置情報へのアクセスをリクエストする必要があります。

位置情報へのアクセスをリクエストする場合は、他の実行時の権限と同じおすすめの方法に従ってください。ただし、位置情報へのアクセスには、関連する権限がシステムに複数あるという重要な違いがあります。リクエストする権限とリクエストの方法は、アプリのユースケースにおける位置情報の要件によって異なります。

このページでは、さまざまな種類の位置情報の要件と、それぞれの場合に位置情報へのアクセスをリクエストする方法について説明します。

位置情報へのアクセスの種類

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 ... >
  <!-- To request foreground location access, declare one of these permissions. -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

精度のレベルは、リクエストする権限によって異なります。

ACCESS_COARSE_LOCATION
位置情報の精度に、街区を指定します。
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION をリクエストしたときよりも正確な位置情報を指定します。この権限は、Bluetooth Low Energy(BLE)で近くのデバイスに接続するなどの一部の接続タスクに必要です。

バックグラウンドでの位置情報

アプリ内の機能が常に他のユーザーと位置情報を共有する場合や、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>

実行時に位置情報へのアクセスをリクエストする

アプリ内の機能が位置情報へのアクセスを必要とするときは、ユーザーがその機能を操作してから、権限のリクエストを行います。このワークフローは、状況に応じて実行時の権限をリクエストするおすすめの方法(アプリの権限をリクエストする方法を参照)に従っています。

図 1 に、このプロセスの実行方法の例を示します。このアプリには、フォアグラウンドでの位置情報へのアクセスを必要とする「位置情報を共有」機能が含まれています。ただし、ユーザーが [位置情報を共有] ボタンを選択するまで、アプリは位置情報へのアクセスをリクエストしません。

ユーザーが [位置情報を共有] ボタンを選択すると、位置情報へのアクセスをリクエストするシステム ダイアログが表示されます
図 1. フォアグラウンドでの位置情報へのアクセスを必要とする位置情報共有機能。この機能は、ユーザーが [アプリの使用中のみ許可] を選択した場合に有効になります。

位置情報へのアクセスが必要な機能がアプリに複数あったとしても、バックグラウンドでの位置情報へのアクセスが必要な機能は多くはありません。このため、アプリで位置情報へのアクセスをリクエストする際には、フォアグラウンドでの位置情報へのアクセスを要求してから、バックグラウンドでの位置情報へのアクセスを要求する「段階的なリクエスト」を実行することをおすすめします。段階的なリクエストを実行すると、アプリのどの機能がバックグラウンドでの位置情報へのアクセスを必要としているかをより正確に把握できるため、ユーザーが細かく管理できるようになり、透明性も増します。

図 2 は、段階的なリクエストを扱うように設計されたアプリの例を示しています。「現在地を表示」と「付近の場所をおすすめ」の両方の機能で、フォアグラウンドでの位置情報へのアクセスが必要です。しかし、バックグラウンドでの位置情報へのアクセスを必要とするのは「付近の場所をおすすめ」機能のみです。

フォアグラウンドでの位置情報へのアクセスを有効にするボタンが、バックグラウンドでの位置情報を有効にするボタンから画面半分の距離にある
図 2. どちらの機能も位置情報アクセスを必要としますが、「付近の場所をおすすめ」機能ではバックグラウンドでの位置情報へのアクセスが必要です。

段階的なリクエストを実行するプロセスは次のとおりです。

  1. まず、図 1 の「位置情報を共有」機能や図 2 の「現在地を表示」機能など、フォアグラウンドでの位置情報へのアクセスが必要な機能をユーザーに案内します。

    アプリからフォアグラウンドでの位置情報へのアクセスがあるまで、バックグラウンドでの位置情報へのアクセスを必要とする機能へのユーザー アクセスを無効にすることをおすすめします。

  2. 後になって、ユーザーがバックグラウンドでの位置情報へのアクセスを必要とする機能を使おうとしたときに、バックグラウンドでの位置情報へのアクセスをリクエストできます。

バックグラウンドから位置情報をリクエストする

図 3. バックグラウンドでの位置情報へのアクセスを許可する [常に許可] というオプションがある設定ページ

Android 10(API レベル 29)を搭載したデバイス上において、アプリ内の機能からバックグラウンドで位置情報がリクエストされる場合、システム権限ダイアログに [常に許可] オプションが表示されます。ユーザーがこのオプションを選択すると、アプリの機能からバックグラウンドでの位置情報へのアクセスが可能になります。

ただし Android 11(API レベル 30)以降では、システム ダイアログに [常に許可] オプションが表示されません。代わりに、図 3 に示すように、ユーザーは設定ページでバックグラウンドでの位置情報を有効にする必要があります。

バックグラウンドでの位置情報の権限をリクエストする場合に、おすすめの方法に従って、ユーザーをこの設定ページに移動させることができます。権限を付与するプロセスは、アプリがターゲットとする SDK のバージョンによって異なります。

Android 11 以降をターゲットとするアプリ

アプリに ACCESS_BACKGROUND_LOCATION 権限が付与されておらず、shouldShowRequestPermissionRationale()true を返した場合、ユーザーに次の内容の説明 UI が表示されるようにします。

  • アプリの機能がバックグラウンドでの位置情報へのアクセスを必要とする明確な理由。
  • ユーザーに表示される、バックグラウンドでの位置情報へのアクセスを許可する設定オプションのラベル(たとえば図 3 の [常に許可])。このラベルを入手するには getBackgroundPermissionOptionLabel() を呼び出します。このメソッドの戻り値は、ユーザーのデバイスの言語設定に合わせてローカライズされています。
  • ユーザーが権限を拒否するためのオプション。ユーザーがバックグラウンド位置情報へのアクセスを拒否した場合に、アプリの使用を続行できるようにします。
ユーザーはシステム通知をタップしてアプリの位置情報設定を変更できます。
図 4. アプリにバックグラウンドでの位置情報へのアクセスを許可したことをユーザーに知らせる通知。

Android 10 以前をターゲットとするアプリ

アプリ内の機能からバックグラウンドでの位置情報へのアクセスがリクエストされると、ユーザーにシステム ダイアログが表示されます。このダイアログから、アプリの位置情報へのアクセスを許可する、設定ページのオプションに移動できます。

アプリがすでに位置情報へのアクセスをリクエストするおすすめの方法に従っている限り、この動作に対応するための変更は不要です。

バックグラウンドでの位置情報の許可に関するリマインダー

Android 10 以降では、ユーザーがバックグラウンドでの位置情報へのアクセスを許可した後、アプリの機能がバックグラウンドでデバイスの位置情報に初めてアクセスすると、システムがユーザーへの通知の送信をスケジュールします。この通知は、デバイスの位置情報への常時アクセスがアプリに許可されていることをユーザーに知らせるものです。通知の例を図 4 に示します。

参考情報

Android の位置情報へのアクセスについて詳しくは、以下の資料をご覧ください。

動画