Запросить специальные разрешения

Специальное разрешение защищает доступ к системным ресурсам, которые особенно чувствительны или не связаны напрямую с конфиденциальностью пользователя. Эти разрешения отличаются от разрешений времени установки и разрешений времени выполнения .

Рисунок 1. Экран доступа к специальным приложениям в настройках системы.

Вот некоторые примеры специальных разрешений:

  • Планирование точных будильников.
  • Отображение и рисование поверх других приложений.
  • Доступ ко всем данным хранилища.

Приложения, которые заявляют о специальном разрешении, отображаются на странице «Доступ специального приложения» в системных настройках (рисунок 1). Чтобы предоставить приложению специальное разрешение, пользователь должен перейти на эту страницу: Настройки > Приложения > Доступ специального приложения .

Рабочий процесс

Чтобы запросить специальное разрешение, выполните следующие действия:

  1. В файле манифеста вашего приложения укажите специальные разрешения , которые может потребоваться запросить вашему приложению.
  2. Разработайте UX вашего приложения так, чтобы определенные действия в вашем приложении были связаны с определенными специальными разрешениями. Дайте пользователям знать, какие действия могут потребовать от них предоставления разрешения вашему приложению на доступ к личным данным пользователя.
  3. Подождите, пока пользователь вызовет задачу или действие в вашем приложении, требующее доступа к определенным личным данным пользователя. В это время ваше приложение может запросить специальное разрешение, необходимое для доступа к этим данным.
  4. Проверьте, предоставил ли пользователь специальное разрешение, которое требуется вашему приложению. Для этого используйте функцию проверки каждого разрешения. Если разрешение предоставлено, ваше приложение может получить доступ к личным данным пользователя. Если нет, перейдите к следующему шагу. Примечание: Вы должны проверять наличие разрешения каждый раз, когда выполняете операцию, требующую этого разрешения.
  5. Предоставьте пользователю обоснование в элементе пользовательского интерфейса, который четко объясняет, к каким данным ваше приложение пытается получить доступ и какие преимущества приложение может предоставить пользователю, если он предоставит особое разрешение. Кроме того, поскольку ваше приложение отправляет пользователей в системные настройки для предоставления разрешения, также включите краткие инструкции, объясняющие, как пользователи могут предоставить разрешение там. Пользовательский интерфейс обоснования должен предоставлять пользователю четкую возможность отказаться от предоставления разрешения. После того, как пользователь признает обоснование, перейдите к следующему шагу.
  6. Запросите специальное разрешение , которое требуется вашему приложению для доступа к личным данным пользователя. Это, вероятно, подразумевает намерение соответствующей страницы в системных настройках, где пользователь может предоставить разрешение. В отличие от разрешений времени выполнения , здесь нет всплывающего диалогового окна разрешения.
  7. Проверьте ответ пользователя — решил ли он предоставить или отклонить специальное разрешение — в методе onResume() .
  8. Если пользователь предоставил разрешение вашему приложению, вы можете получить доступ к личным данным пользователя. Если пользователь отклонил разрешение, вместо этого аккуратно ухудшите работу вашего приложения , чтобы оно предоставляло пользователю функциональность без информации, защищенной этим разрешением.
Рисунок 2. Рабочий процесс объявления и запроса специальных разрешений на Android.

Запросить специальные разрешения

В отличие от разрешений времени выполнения , пользователь должен предоставить специальные разрешения со страницы Special App Access в системных настройках. Приложения могут отправлять пользователей туда с помощью намерения, которое приостанавливает приложение и запускает соответствующую страницу настроек для данного специального разрешения. После того, как пользователь возвращается в приложение, приложение может проверить, было ли предоставлено разрешение в функции 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 , пока пользователь не запланирует отправку электронного письма на определенное время.

Объясните запрос

Предоставьте обоснование перед перенаправлением на системные настройки. Поскольку пользователи временно покидают приложение, чтобы предоставить особые разрешения, покажите пользовательский интерфейс в приложении, прежде чем запускать намерение на странице «Доступ к особым приложениям» в системных настройках. Этот пользовательский интерфейс должен четко объяснять, почему приложению нужно разрешение и как пользователь должен предоставить его на странице настроек.