Специальное разрешение защищает доступ к системным ресурсам, которые являются особенно конфиденциальными или не связаны напрямую с конфиденциальностью пользователя. Эти разрешения отличаются от разрешений времени установки и разрешений времени выполнения .
Вот некоторые примеры специальных разрешений:
- Планирование точных будильников.
- Отображение и рисование поверх других приложений.
- Доступ ко всем данным хранилища.
Приложения, требующие специального разрешения, отображаются на странице «Доступ специальных приложений» в системных настройках (рис. 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
, пока пользователь не запланирует отправку электронного письма на определённое время.
Объясните запрос
Предоставьте обоснование перед перенаправлением на страницу системных настроек. Поскольку пользователи временно выходят из приложения, чтобы предоставить особые разрешения, перед запуском намерения на странице «Доступ специального приложения» в системных настройках отобразите встроенный пользовательский интерфейс. Этот интерфейс должен чётко объяснять, зачем приложению нужно это разрешение и как пользователь должен его предоставить на странице настроек.