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