Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

位置情報パーミッションをリクエストする

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

位置情報のパーミッションをリクエストする場合は、他のランタイム パーミッションと同じおすすめの方法に従ってください。ただし、位置情報のパーミッションには、システムに位置情報に関連するパーミッションが複数あるという重要な違いがあります。リクエストするパーミッションとリクエストの方法は、アプリのユースケースの位置情報要件によって異なります。

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

位置情報アクセスの種類

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 に示します。