Poproś o uprawnienia specjalne

Specjalne uprawnienie chroni dostęp do zasobów systemowych, które są szczególnie poufne lub nie są bezpośrednio związane z prywatnością użytkownika. Te uprawnienia różnią się od uprawnień podczas instalacji i uprawnień środowiska wykonawczego.

Rysunek 1. Ekran Aplikacje ze specjalnym dostępem w ustawieniach systemowych

Oto kilka przykładów uprawnień specjalnych:

  • Planuję alarmy precyzyjne.
  • wyświetlanie i rysowanie nad innymi aplikacjami;
  • Dostęp do wszystkich danych pamięci masowej.

Aplikacje, które zadeklarują specjalne uprawnienia, są widoczne na stronie Aplikacje ze specjalnym dostępem w ustawieniach systemu (ilustracja 1). Aby przyznać aplikacji specjalne uprawnienia, użytkownik musi otworzyć tę stronę: Ustawienia > Aplikacje > Aplikacje ze specjalnym dostępem.

Workflow

Aby poprosić o specjalne uprawnienia:

  1. W pliku manifestu aplikacji zadeklaruj specjalne uprawnienia, których może ona potrzebować.
  2. Zaprojektuj aplikację tak, aby określone działania w niej były powiązane z określonymi uprawnieniami. Poinformuj użytkowników, które działania mogą wymagać przyznania aplikacji uprawnień dostępu do ich prywatnych danych.
  3. Zaczekaj, aż użytkownik wywoła w Twojej aplikacji zadanie, które wymaga dostępu do określonych prywatnych danych użytkownika. Wtedy aplikacja może poprosić o specjalne uprawnienia, które są wymagane, by uzyskać dostęp do tych danych.
  4. Sprawdź, czy użytkownik przyznał już specjalne uprawnienie, którego wymaga Twoja aplikacja. Aby to zrobić, użyj własnej funkcji sprawdzania każdego uprawnienia. Gdy przyznasz te uprawnienia, aplikacja będzie miała dostęp do prywatnych danych użytkownika. Jeśli nie, przejdź do następnego. Uwaga: musisz sprawdzić, czy masz odpowiednie uprawnienia za każdym razem, gdy wykonujesz operację, która wymaga tego uprawnienia.
  5. W elemencie interfejsu przedstaw użytkownikowi uzasadnienie wyjaśniające, do jakich danych chce uzyskać dostęp aplikacja i jakie korzyści może zapewnić użytkownikowi, jeśli przyzna specjalne uprawnienia. Ponieważ aplikacja przekierowuje użytkowników do ustawień systemu w celu przyznania tych uprawnień, dodaj też krótkie instrukcje, które wyjaśnią, jak użytkownicy mogą przyznać te uprawnienia. Interfejs z uzasadnieniem powinien zawierać wyraźną opcję umożliwiającą użytkownikowi rezygnację z udzielenia uprawnień. Gdy użytkownik potwierdzi uzasadnienie, przejdź do następnego kroku.
  6. Poproś o specjalne uprawnienia, których aplikacja wymaga dostępu do prywatnych danych użytkownika. Prawdopodobnie wiąże się to z intencjami w ustawieniach systemu, w przypadku których użytkownik może przyznać odpowiednie uprawnienia. W przeciwieństwie do uprawnień środowiska wykonawczego nie ma wyskakującego okienka z uprawnieniami.
  7. Sprawdź odpowiedź użytkownika – czy przyznał, czy odmówił – w metodzie onResume().
  8. Jeśli użytkownik przyznał Twojej aplikacji odpowiednie uprawnienia, możesz uzyskać dostęp do prywatnych danych użytkownika. Jeśli użytkownik odmówił przyznania uprawnień, bezproblemowo pogorszyj działanie aplikacji, aby umożliwić mu korzystanie z funkcji bez korzystania z informacji chronionych tym uprawnieniem.
Rys. 2. Proces deklarowania i wysyłania próśb o specjalne uprawnienia na Androidzie

Prośba o specjalne uprawnienia

W przeciwieństwie do uprawnień środowiska wykonawczego użytkownik musi przyznać specjalne uprawnienia na stronie Specjalny dostęp do aplikacji w ustawieniach systemu. Aplikacje mogą wysyłać do niej użytkowników za pomocą intencji, która wstrzymuje działanie aplikacji i uruchamia odpowiednią stronę ustawień dla danego uprawnienia specjalnego. Gdy użytkownik wróci do aplikacji, aplikacja może sprawdzić, czy uprawnienie zostało przyznane w funkcji onResume().

Ten przykładowy kod pokazuje, jak poprosić użytkowników o specjalne uprawnienia 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))
   }
}

Przykładowy kod do sprawdzania uprawnień i obsługi decyzji użytkownika w 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(...)
   }
}

Sprawdzone metody i wskazówki

W sekcjach poniżej znajdziesz sprawdzone metody i kwestie, które należy wziąć pod uwagę, gdy prosisz o uprawnienia specjalne.

Każde uprawnienie ma własną metodę sprawdzania

Uprawnienia specjalne działają inaczej niż uprawnienia czasu działania. Zamiast tego zapoznaj się z informacjami o uprawnieniach interfejsu API i korzystaj z niestandardowych funkcji sprawdzania dostępu dla poszczególnych uprawnień. Na przykład AlarmManager#canScheduleExactAlarms() w przypadku uprawnienia SCHEDULE_EXACT_ALARMS i Environment#isExternalStorageManager() dla uprawnień MANAGE_EXTERNAL_STORAGE.

Prośba w kontekście

Podobnie jak w przypadku uprawnień w czasie działania aplikacje powinny prosić o specjalne uprawnienia w kontekście, gdy użytkownik zażąda określonego działania, które wymaga określonych uprawnień. Możesz na przykład poczekać z prośbą o uprawnienie SCHEDULE_EXACT_ALARMS, dopóki użytkownik nie zaplanuje wysłania e-maila o określonej godzinie.

Wyjaśnij żądanie

Podaj uzasadnienie, zanim przejdziesz do ustawień systemu. Ponieważ użytkownicy wychodzą z aplikacji tymczasowo, aby przyznać specjalne uprawnienia, przed uruchomieniem intencji na stronie Specjalny dostęp do aplikacji w ustawieniach systemowych pokaż interfejs w aplikacji. Interfejs ten powinien jasno wyjaśniać, dlaczego aplikacja potrzebuje danego uprawnienia i w jaki sposób użytkownik powinien je przyznać na stronie ustawień.