Обновления разрешений в Android 11

Android 11 предоставляет пользователям возможность более детально задавать разрешения для местоположения, микрофона и камеры. Кроме того, система сбрасывает разрешения неиспользуемых приложений, ориентированных на Android 11 или более поздние версии, и приложениям может потребоваться обновить заявленные ими разрешения, если они используют системное окно предупреждений или считывают информацию, связанную с номерами телефонов.

Разовые разрешения

Начиная с Android 11, всякий раз, когда ваше приложение запрашивает разрешение, связанное с местоположением, микрофоном или камерой, в диалоговом окне разрешений, отображаемом пользователю, появляется опция « Только на этот раз ». Если пользователь выберет эту опцию в диалоговом окне, вашему приложению будет предоставлено временное одноразовое разрешение .

Узнайте больше о том, как система обрабатывает одноразовые разрешения .

Автоматический сброс разрешений для неиспользуемых приложений

Если ваше приложение ориентировано на 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]
...

Права доступа, в которых пользователь однажды отказал, помечаются параметром USER_SET . Права доступа, в которых отказано окончательно путем двукратного выбора параметра «Запретить», помечаются параметром 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 автоматически получает это разрешение, если пользователь явно не запретил его приложению. Когда приложение прекращает захват экрана, оно теряет это разрешение. Этот сценарий использования в основном предназначен для приложений, осуществляющих прямую трансляцию игр.

Эти приложениям не нужно отправлять ACTION_MANAGE_OVERLAY_PERMISSION для получения разрешения SYSTEM_ALERT_WINDOW ; приложения могут просто запросить 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_NUMBERS вместо разрешения READ_PHONE_STATE .

Если ваше приложение объявляет READ_PHONE_STATE для вызова методов, отличных от перечисленных выше, вы можете продолжать запрашивать READ_PHONE_STATE во всех версиях Android. Однако если вы используете разрешение READ_PHONE_STATE только для методов из предыдущего списка, обновите файл манифеста следующим образом:

  1. Измените объявление параметра READ_PHONE_STATE таким образом, чтобы ваше приложение использовало это разрешение только на Android 10 (уровень API 29) и ниже.
  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.