おおよその位置情報

このダイアログでは、おおよその位置情報へのアクセス権のみを確認するメッセージが表示され、3 つのボタンが上下に並んでいます
図 1. アプリが ACCESS_COARSE_LOCATION のみをリクエストした場合に表示されるシステム権限ダイアログ。

Android 12 は、位置情報の利用許可モデル(バックグラウンドでの位置情報1 回だけのアクセス許可など)に関するプラットフォームの最新の変更をベースにしています。Android 12 をターゲットとするアプリでは、アプリが ACCESS_FINE_LOCATION ランタイム権限をリクエストした場合でも、ユーザーはアプリがおおよその位置情報しか取得しないようにリクエストできます。

アプリが ACCESS_COARSE_LOCATION をリクエストして ACCESS_FINE_LOCATION をリクエストしていない場合、このページに記載されている変更による影響は受けません。図 1 は、Android 12 をターゲットとするアプリが ACCESS_COARSE_LOCATION のみをリクエストした場合に、ユーザーに表示されるダイアログを示しています。

ユーザーのプライバシーを尊重して、ACCESS_COARSE_LOCATION のみをリクエストすることをおすすめします。おおよその位置情報にしかアクセスできない場合でも、ほとんどのユースケースに対応できます。

アプリが Android 12 をターゲットとしており、ACCESS_FINE_LOCATION 権限をリクエストする場合は、ACCESS_COARSE_LOCATION 権限もリクエストする必要があります(1 つのランタイム リクエストに両方の権限を含めます)。ACCESS_FINE_LOCATION のみをリクエストしようとすると、リクエストは無視され、logcat に「ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION」というエラー メッセージが記録されます。

おおよその位置情報と正確な位置情報のいずれかをユーザーが選択

ダイアログでは 2 つのオプション セットが上下に表示されています
図 2. アプリが Android 12 をターゲットとし、1 つのランタイム リクエストで ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION の両方をリクエストした場合に表示されるシステム権限ダイアログ。

アプリが ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION の両方をリクエストした場合、システム権限ダイアログには次の新しいオプションが表示されます。

  • 正確: ACCESS_FINE_LOCATION 権限によって指定される位置情報の精度を提供します。
  • おおよそ: ACCESS_COARSE_LOCATION 権限によって指定される位置情報の精度を提供します。

図 2 は、ユーザーが選択しやすくなるように、両方の新しいオプションに対応するビジュアル キューがダイアログに含まれていることを示しています。ユーザーは、位置情報の精度を決定した後、3 つのボタンのいずれかをタップして、権限を付与する期間を選択します。これらのボタンは、Android 11(API レベル 30)を搭載しているデバイスで、位置情報の利用許可ダイアログに表示されるボタンと同じです。

Android 12 では、アプリのターゲット SDK のバージョンにかかわらず、ユーザーはシステム設定に移動して、アプリごとに適切な位置情報の精度を設定できます。これは、Android 11 以前を搭載しているデバイスにアプリをインストールした後、Android 12 にアップグレードした場合にも当てはまります。権限ダイアログまたはシステム設定で、ユーザーが位置情報に対するアプリのアクセス権を「正確」から「おおよそ」にダウングレードした場合、システムはアプリのプロセスを再起動します。こうした理由から、ランタイム権限をリクエストするためのおすすめの方法を実践することが特に重要です。

ユーザーの選択は権限の付与に影響

次の表に、ユーザーがランタイム権限ダイアログで選択したオプションに基づいて、システムがアプリに付与する権限を示します。

正確 おおよそ
アプリの使用時のみ ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
今回のみ ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
許可しない 位置情報の利用を許可しない 位置情報の利用を許可しない

システムがアプリに付与した権限を確認するには、権限リクエストの戻り値を確認します。Jetpack ライブラリを次のようなコードで使用することも、プラットフォーム ライブラリを使用して権限リクエスト コードを自身で管理することもできます。

Kotlin

val locationPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        when {
            permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
                // Precise location access granted.
            }
            permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
                // Only approximate location access granted.
            } else -> {
                // No location access granted.
            }
        }
    }

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean coarseLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_COARSE_LOCATION,false);
            if (fineLocationGranted != null && fineLocationGranted) {
                // Precise location access granted.
            } else if (coarseLocationGranted != null && coarseLocationGranted) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    );

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(new String[] {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
});

ユーザーの選択はバックグラウンドでの位置情報にも影響

システムが ACCESS_BACKGROUND_LOCATION 権限をアプリに付与する場合、位置情報の利用許可ダイアログでユーザーが選択したオプションは、バックグラウンドでの位置情報にも適用されます。

たとえば、ユーザーがアプリに ACCESS_BACKGROUND_LOCATION 権限を付与したとしても、フォアグラウンドではおおよその位置情報へのアクセスしか許可していない場合は、バックグラウンドでもおおよその位置情報へのアクセスしか許可されません。

正確な位置情報にアップグレードする

ユーザーがおおよその位置情報を選択することで、現在 ACCESS_FINE_LOCATION 権限を使用して正確な位置情報にアクセスしているアプリに影響を及ぼす可能性があります。

アプリのアクセス権を正確な位置情報にアップグレードするようユーザーに依頼する前に、アプリのユースケースでこのレベルの精度がどうしても必要かどうかを判断してください。アプリがデバイスを Bluetooth または Wi-Fi 経由で近くのデバイスとペア設定する必要がある場合は、ACCESS_FINE_LOCATION 権限をリクエストする代わりに、コンパニオン デバイスのペア設定か、新しい Bluetooth の権限を使用することをおすすめします。

位置情報に対するアプリのアクセス権を「おおよそ」から「正確」にアップグレードするようユーザーにリクエストする方法は次のとおりです。

  1. 必要に応じて、アプリが権限を必要とする理由を説明します。
  2. ACCESS_FINE_LOCATION 権限と ACCESS_COARSE_LOCATION 権限をもう一度リクエストします。ユーザーはすでにアプリにおおよその位置情報へのアクセス権を付与することを許可しているため、システム ダイアログの内容は前と異なります。図 3図 4 をご覧ください。
ダイアログには、[正確な位置情報に切り替える]、[今回のみ]、[許可しない] というオプションがあります。
図 3. ユーザーが以前に [おおよそ] と [アプリの使用時のみ] を選択していた場合(図 2 のダイアログを参照)。
ダイアログには [今回のみ] と [許可しない] のオプションがあります。
図 4. ユーザーが以前に [おおよそ] と [今回のみ] を選択していた場合(図 2 のダイアログを参照)。

アプリがおおよその位置情報をどのように処理するかをテストする

ユーザーによる設定が可能な位置情報の精度をサポートするためにアプリを更新する必要があるかどうかを評価するには、このセクションで説明するテストを行います。

ダイアログからおおよその位置情報がリクエストされた場合の処理

新しいダイアログで、アプリがおおよその位置情報へのアクセス権を持つことをユーザーがリクエストした場合に、アプリがどのように処理するかを確認するには、次の手順を行います。

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION の両方をリクエストします。
  2. 表示されたダイアログ(図 2)で、上部にある [おおよそ] を選択してから、下部にある [アプリの使用時のみ] または [今回のみ] を選択します。
  3. アプリがおおよその位置情報にしかアクセスできない場合でも、アプリのユースケースが想定どおりに機能するかどうかを確認します。

システム設定からおおよその位置情報へのダウングレードがリクエストされた場合の処理

図 5. システム設定のアプリの位置情報の利用許可画面に、[正確な位置情報を使用] が追加されました。このオプションは、画面の上部にある位置情報へのアクセスの設定とは別のものです。

システム設定で、アプリの位置情報へのアクセスを「正確」から「おおよそ」に変更するようユーザーがリクエストした場合に、アプリがどのように処理するかを確認するには、次の手順を行います。

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION の両方をリクエストします。
  2. 表示されたダイアログ(図 2)で、上部にある [正確] を選択してから、下部にある [アプリの使用時のみ] または [今回のみ] を選択します。
  3. システム設定でアプリの権限画面に移動します。
  4. 位置情報の利用許可画面で、[正確な位置情報を使用] をオフにします。このオプションは図 5 に表示されます。

    他の権限をダウングレードする場合と同様に、システムはアプリのプロセスを再起動します。

  5. アプリがおおよその位置情報にしかアクセスできない場合でも、アプリのユースケースが想定どおりに機能するかどうかを確認します。

システム設定から正確な位置情報へのアップグレードがリクエストされた場合の処理

システム設定で、アプリの位置情報へのアクセスを「おおよそ」から「正確」に変更するようユーザーがリクエストした場合に、アプリがどのように処理するかを確認するには、次の手順を行います。

  1. ACCESS_FINE_LOCATIONACCESS_COARSE_LOCATION の両方をリクエストします。
  2. 表示されたダイアログ(図 2)で、上部にある [おおよそ] を選択してから、下部にある [アプリの使用時のみ] または [今回のみ] を選択します。
  3. システム設定でアプリの権限画面に移動します。
  4. 図 5 に示すように、位置情報の利用許可画面で [正確な位置情報を使用] をオンにします。

    この権限の変更はアップグレードであるため、システムはアプリの再起動を行いません。

  5. アプリが位置情報ベースのユースケースでより正確な位置情報を受信しているかどうかを確認します。

アプリの SDK の依存関係における位置情報の要件を確認する

ACCESS_FINE_LOCATION 権限に依存する SDK がアプリで使用されているかどうかを確認します。Medium の記事、SDK の依存関係の動作を把握するをご覧ください。