Запрос специальных разрешений

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

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

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

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

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

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

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

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

Запрос специальных разрешений

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

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

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