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

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

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

Примерами особых разрешений являются следующие:

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

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

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

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

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

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

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

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

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