Обновления разрешений в 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