Android 11 での権限に関する更新

Android 11 では、位置情報、マイク、カメラへの権限をユーザーがより詳細に指定できます。さらに、Android 11 以降をターゲットとするアプリが未使用の場合、アプリの権限がシステムによってリセットされます。このため、アプリがシステム アラート ウィンドウを使用する場合、または電話番号に関連する情報を読み取る場合、宣言している権限の更新が必要になることがあります。

1 回だけのアクセス許可

Android 11 以降では、アプリが位置情報、マイク、またはカメラに関連する権限をリクエストするたびに、ユーザー向けの権限ダイアログに [今回のみ] というオプションが表示されます。ユーザーがダイアログでこのオプションを選択した場合、アプリには一時的な「1 回だけのアクセス許可」が付与されます。

詳しくは、1 回だけのアクセス許可の扱いに関する記事をご覧ください。

使用していないアプリの権限を自動リセットする

Android 11 以降をターゲットとするアプリが数か月間使用されていない場合、システムはユーザーデータを保護するために、ユーザーがアプリに付与した機密情報に関するランタイム権限を自動的にリセットします。このアクションは、ユーザーがシステム設定で権限を確認してアプリのアクセスレベルを [許可しない] に変更するのと同じ効果があります。アプリが実行時に権限をリクエストするためのおすすめの方法に従っている場合、アプリを変更する必要はありません。ユーザーがアプリの機能を操作した時点で、その機能に必要な権限が付与されていることが確認されるからです。

詳しくは、システムが未使用アプリの権限を自動的にリセットする仕組みをご覧ください。

権限ダイアログの表示

Android 11 以降では、デバイスにインストールされたアプリの全期間に、同じ権限に対してユーザーが何度も [許可しない] をタップした場合、アプリがその権限を再度リクエストしても、ユーザーにシステム権限ダイアログが表示されることはありません。このユーザーのアクションにより、[次回から表示しない] が選択されたことになります。以前のバージョンでは、ユーザーが以前に [次回から表示しない] チェックボックスまたはオプションをオンにしていない限り、アプリが権限をリクエストするたびに、システム権限ダイアログが表示されていました。Android 11 ではこの動作が変更され、ユーザーが許可しないことを選択した権限を、繰り返しリクエストすることは推奨されません。

アプリが(デバッグとテストを行う目的の)権限を完全に拒否されたかどうかを確認するには、次のコマンドを使用します。

adb shell dumpsys package PACKAGE_NAME

ここでの PACKAGE_NAME は検査するパッケージの名前です。

コマンドの出力には、次のようなセクションが含まれます。

...
runtime permissions:
  android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
...

ユーザーが 1 回拒否した権限は、USER_SET によってフラグが設定されます。[拒否] を 2 回選択して恒久的に拒否された権限は、USER_FIXED によってフラグが設定されます。

テスト中にこれらのフラグをリセットして、リクエスト ダイアログが表示されていない場合にテスターが驚かないようにすることをおすすめします。これを行うには、次のコマンドを使用します。

adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed

PERMISSION_NAME は、リセットする権限の名前です。Android アプリの権限の全一覧については、権限 API リファレンスのページをご覧ください。

詳しくは、アプリでの権限の拒否を処理する方法をご覧ください。

システム アラート ウィンドウの変更

Android 11 では、アプリに SYSTEM_ALERT_WINDOW 権限を付与する方法がいくつか変更されています。この変更は、権限を付与する際の意識を高めることで、ユーザーを保護するのが目的です。

特定のアプリにはリクエストに応じて SYSTEM_ALERT_WINDOW 権限が自動的に付与される

アプリの特定のクラスには、リクエストに応じて SYSTEM_ALERT_WINDOW 権限が自動的に付与されます。

  • ROLE_CALL_SCREENING を持ち、SYSTEM_ALERT_WINDOW をリクエストするアプリはすべて、自動的にこの権限が付与されます。アプリが ROLE_CALL_SCREENING を失うと、権限も失われます。

  • MediaProjection を介して画面をキャプチャし、SYSTEM_ALERT_WINDOW をリクエストするアプリには、ユーザーがアプリに対する権限を明示的に拒否しない限り、自動的にこの権限が付与されます。アプリが画面のキャプチャを停止すると、権限は失われます。このユースケースは、主にゲームのライブ配信を行うアプリを対象としています。

これらのアプリは SYSTEM_ALERT_WINDOW 権限を取得するために ACTION_MANAGE_OVERLAY_PERMISSION を送信する必要はありません。アプリは SYSTEM_ALERT_WINDOW を直接リクエストできます。

ユーザーを常にシステム権限の画面に移動する MANAGE_OVERLAY_PERMISSION インテント

Android 11 以降、ACTION_MANAGE_OVERLAY_PERMISSION インテントはユーザーを常にトップレベルの [設定] 画面に移動します。この画面でユーザーはアプリに対して SYSTEM_ALERT_WINDOW 権限を付与したり、取り消したりすることができます。インテント内の package: のデータは無視されます。

Android の以前のバージョンでは、ACTION_MANAGE_OVERLAY_PERMISSION インテントでパッケージを指定して、権限を管理する、アプリ専用の画面にユーザーを移動できました。この機能は、Android 11 以降サポートされません。代わりに、権限を付与または取り消すアプリを、ユーザーが最初に選択する必要があります。この変更は、権限を付与する際の意識を高めることで、ユーザーを保護するのが目的です。

電話番号

Android 11 では、アプリが電話番号を読み取るときに使用する電話関連の権限が変更されます。

Android 11 以降をターゲットとするアプリで、以下のリストに示す電話番号 API にアクセスする必要がある場合、READ_PHONE_STATE 権限ではなく、READ_PHONE_NUMBERS 権限をリクエストする必要があります。

アプリが READ_PHONE_STATE を宣言して上記のリスト以外のメソッドを呼び出す場合は、すべての Android バージョンで引き続き READ_PHONE_STATE をリクエストできます。ただし、上記のリストのメソッドにのみ READ_PHONE_STATE 権限を使用する場合は、マニフェスト ファイルを次のように更新します。

  1. アプリが Android 10(API レベル 29)以下でのみ権限を使用するように、READ_PHONE_STATE の宣言を変更します。
  2. READ_PHONE_NUMBERS 権限を追加します。

このプロセスを実行する宣言スニペットを以下に示します。

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

参考情報

Android 11 での権限の変更について詳しくは、次の資料をご覧ください。

動画

Android 11 の最新のプライバシー変更を反映した開発