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

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

1 回だけのアクセス許可

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

アプリの動作とユーザーの操作に応じて、一定期間アプリは該当するデータにアクセスできます。

  • アプリのアクティビティが表示されている間、アプリはデータにアクセスできます。
  • ユーザーがアプリをバックグラウンドに移行しても、アプリは短時間だけデータにアクセスできます。
  • アクティビティが表示されている間にフォアグラウンド サービスを起動した場合、ユーザーがアプリをバックグラウンドに移動しても、そのフォアグラウンド サービスが停止するまで、アプリは引き続きそのデータにアクセスできます。
  • ユーザーがシステム設定などで 1 回だけのアクセス許可を取り消した場合、アプリはフォアグラウンドサービスを開始したかどうかにかかわらず、データにアクセスできなくなります。他の権限と同様に、ユーザーがアプリの 1 回だけのアクセス許可を取り消すと、アプリのプロセスは終了します。

ユーザーが次にアプリを開いて、アプリ内の機能が位置情報、マイク、またはカメラへのアクセスをリクエストすると、ユーザーに再度権限の付与が求められます。

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

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

自動リセットを無効にするようにユーザーにリクエストする

必要に応じて、システムがアプリの権限をリセットしないように設定することをユーザーに依頼します。これは、以下のユースケースのように、ユーザーがアプリを操作しなくても主にバックグラウンドで動作することが前提となっている場合に役立ちます。

図 1. 特定のアプリについて、ユーザーが権限の自動リセットを無効化
  • 家族の安全を確保する
  • データを同期する
  • スマート デバイスと通信する
  • コンパニオン デバイスとペア設定する

アプリ内のシステム設定のページにユーザーを誘導するには、Intent.ACTION_AUTO_REVOKE_PERMISSIONS インテント アクションを含むインテントを呼び出します。ユーザーはこの画面で次の手順に沿って、システムがアプリの権限をリセットしないように設定できます。

  1. [権限] をタップすると、[アプリの権限] 設定画面が読み込まれます。
  2. 図 1 に示すように、[アプリが使用されていない場合に権限を削除] をオフにします。

自動リセットが無効になっているかどうかを確認する

アプリで自動リセット機能が無効になっているか確認するには、isAutoRevokeWhitelisted() を呼び出します。 この方法で true が返された場合、アプリの権限は自動リセットされません。

自動リセット機能をテストする

システムがアプリの権限をリセットすることを確認するには、次のようにします。

  1. システムがアプリの権限をリセットするまでのデフォルトの時間を保持します。それにより、テスト後の復元が可能になります。

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  2. システムが権限をリセットするまでの時間を短縮します。次の例では、アプリの操作を中断して 1 秒後にアプリの権限がリセットされるように変更されています。

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  3. 次のスニペットに示すように、自動リセット プロセスを手動で呼び出します。 テストデバイスを短時間(約 45 秒間)オンにしてから、このコマンドを実行します。

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  4. アプリが自動リセット イベントを処理できることを確認します。

  5. システムがアプリの権限を自動リセットするまでのデフォルトの時間を元に戻します。

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    

権限ダイアログの表示

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="READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="READ_PHONE_NUMBERS" />
</manifest>