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

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

Одноразовые разрешения

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

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

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

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

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

Видимость диалогового окна разрешения

Начиная с 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 . Разрешения, которые были отклонены навсегда путем выбора Deny дважды, помечаются 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