Специальные разрешения защищают доступ к системным ресурсам, которые являются конфиденциальными или не связаны напрямую с конфиденциальностью пользователя. Они отличаются от разрешений, предоставляемых при установке, и динамических разрешений.
Вот несколько примеров специальных разрешений:
- Планирование операций в точное время.
- Показ поверх других приложений.
- Доступ ко всем данным в хранилище.
Приложения, запрашивающие специальное разрешение, показаны на странице Специальный доступ в системных настройках (рис. 1). Чтобы предоставить приложению специальное разрешение, пользователю нужно перейти в раздел Настройки > Приложения > Специальный доступ.
Рабочий процесс
Чтобы запросить специальное разрешение, выполните следующие действия:
- В файле манифеста приложения объявите специальные разрешения, которые могут потребоваться приложению.
- Разработайте пользовательский интерфейс приложения так, чтобы определенные действия в нем были связаны с конкретными специальными разрешениями. Сообщите пользователям, какие действия могут потребовать от них предоставления разрешения на доступ вашего приложения к личным данным пользователя.
- Дождитесь, пока пользователь запустит задачу или действие в приложении, для которых требуется доступ к определенным личным данным. В этот момент приложение может запросить специальное разрешение, необходимое для доступа к этим данным.
- Проверьте, предоставил ли пользователь специальное разрешение, которое требуется вашему приложению. Для этого используйте специальную функцию проверки для каждого разрешения. Если пользователь предоставит разрешение, приложение получит доступ к его личным данным. Если нет, переходите к следующему пункту. Примечание. Вы должны проверять наличие разрешения каждый раз, когда выполняете операцию, которая его требует.
- Покажите пользователю в элементе интерфейса обоснование, в котором четко объясняется, к каким данным приложение пытается получить доступ и какие преимущества оно может предоставить пользователю, если он предоставит специальное разрешение. Поскольку для предоставления разрешения приложение перенаправляет пользователей в системные настройки, добавьте краткие инструкции о том, как это сделать. В интерфейсе обоснования должна быть четкая возможность отказаться от предоставления разрешения. После того как пользователь подтвердит, что ознакомился с обоснованием, перейдите к следующему шагу.
- Запросите специальное разрешение, которое требуется вашему приложению для доступа к личным данным пользователя. Для этого, скорее всего, потребуется намерение, которое перенаправит пользователя на нужную страницу в системных настройках. В отличие от динамических разрешений, диалоговое окно не появляется.
- Проверьте ответ пользователя (предоставил ли он разрешение) в методе
onResume(). - Если пользователь предоставил разрешение вашему приложению, вы можете получить доступ к его личным данным. Если пользователь не предоставил разрешение, примените стратегию постепенного сокращения, чтобы приложение работало без доступа к информации, защищенной этим разрешением.
Запрос специальных разрешений
В отличие от динамических разрешений, специальные разрешения пользователь должен предоставить на странице Специальный доступ в системных настройках. Приложения могут перенаправлять пользователей на эту страницу с помощью намерения, которое приостанавливает работу приложения и открывает страницу настроек для специального разрешения. Когда пользователь вернется в приложение, оно может проверить, было ли предоставлено разрешение, с помощью функции onResume().
В примере кода ниже показано, как запросить у пользователей специальное разрешение SCHEDULE_EXACT_ALARMS.
val alarmManager = getSystemService<AlarmManager>()!!
when {
// if permission is granted, proceed with scheduling exact alarms…
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// ask users to grant the permission in the corresponding settings page
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
Образец кода для проверки разрешения и обработки решений пользователя в onResume():
override fun onResume() {
// ...
if (alarmManager.canScheduleExactAlarms()) {
// proceed with the action (setting exact alarms)
alarmManager.setExact(...)
}
else {
// permission not yet approved. Display user notice and gracefully
// degrade your app experience.
alarmManager.setWindow(...)
}
}
Советы по запросу специальных разрешений
В следующих разделах приведены рекомендации и советы по запросу специальных разрешений.
Для каждого разрешения есть свой метод проверки.
Специальные разрешения работают иначе, чем динамические разрешения. Вместо этого используйте специальные функции проверки доступа для каждого разрешения, описанные в справочной документации по API разрешений. Примеры: AlarmManager#canScheduleExactAlarms() для разрешения SCHEDULE_EXACT_ALARMS и Environment#isExternalStorageManager() для разрешения MANAGE_EXTERNAL_STORAGE.
Запрос в контексте
Как и в случае с динамическими разрешениями, приложения должны запрашивать специальные разрешения в контексте, когда пользователь выполняет действие, требующее разрешения. Например, не запрашивайте разрешение SCHEDULE_EXACT_ALARMS, пока пользователь не запланирует отправку электронного письма на определенное время.
Объясните запрос
Предоставьте обоснование, прежде чем перенаправлять пользователя в системные настройки. Поскольку для предоставления специальных разрешений пользователям нужно временно покинуть приложение, покажите им интерфейс в приложении, прежде чем запускать намерение для перехода на страницу Специальный доступ в системных настройках. В интерфейсе должно быть четко объяснено, зачем приложению нужно разрешение и как пользователь может предоставить его на странице настроек.