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
.
- Метод
getLine1Number()
в классахTelephonyManager
иTelecomManager
. - Неподдерживаемый метод
getMsisdn()
в классеTelephonyManager
.
Если ваше приложение объявляет READ_PHONE_STATE
для вызова методов, отличных от перечисленных в предыдущем списке, вы можете продолжать запрашивать READ_PHONE_STATE
во всех версиях Android. Однако, если вы используете разрешение READ_PHONE_STATE
только для методов из предыдущего списка, обновите файл манифеста следующим образом:
- Измените объявление
READ_PHONE_STATE
так, чтобы ваше приложение использовало это разрешение только на Android 10 (уровень API 29) и ниже. - Добавьте разрешение
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