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