Poproś o uprawnienia specjalne

Uprawnienie specjalne 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ń w czasie instalacji i uprawnień w czasie działania.

Rysunek 1. Ekran Specjalny dostęp do aplikacji w ustawieniach systemu.

Oto kilka przykładów uprawnień specjalnych:

  • Planuję alarmy dokładne.
  • wyświetlanie i rysowanie nad innymi aplikacjami,
  • Dostęp do wszystkich informacji o pamięci.

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 uprawnienie:

  1. W pliku manifestu zadeklaruj specjalne uprawnienia, o które może prosić aplikacja.
  2. Zaprojektuj interfejs aplikacji tak, aby określone działania w niej były powiązane z określonymi uprawnieniami specjalnymi. Poinformuj użytkowników, które działania mogą wymagać od nich przyznania aplikacji uprawnień dostępu do prywatnych danych użytkownika.
  3. Poczekaj, aż użytkownik wywoła w aplikacji zadanie lub działanie, które wymaga dostępu do określonych prywatnych danych użytkownika. Wtedy aplikacja może poprosić o specjalne uprawnienia wymagane do uzyskania dostępu do tych danych.
  4. Sprawdź, czy użytkownik nie przyznał już specjalnych uprawnień wymaganych przez aplikację. Aby to zrobić, użyj niestandardowej funkcji sprawdzania poszczególnych uprawnień. 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 to uprawnienie za każdym razem, gdy wykonujesz operację, która je wymaga.
  5. Przedstaw użytkownikowi uzasadnienie za pomocą elementu interfejsu, który jasno wyjaśnia, do jakich danych aplikacja próbuje uzyskać dostęp i jakie korzyści może przynieść użytkownikowi aplikacja, jeśli przyzna on specjalne uprawnienia. Ponieważ aplikacja odsyła użytkowników do ustawień systemu w celu przyznania uprawnień, dołącz krótkie instrukcje wyjaśniające, jak użytkownicy mogą przyznać te uprawnienia w tych ustawieniach. Interfejs uzasadnienia powinien zawierać wyraźną opcję rezygnacji z udzielania uprawnień. Gdy użytkownik potwierdzi uzasadnienie, przejdź do następnego kroku.
  6. Poproś aplikację o specjalne uprawnienia dotyczące dostępu do prywatnych danych użytkownika. Prawdopodobnie wiąże się to z intencją odpowiedniej strony w ustawieniach systemu, na której użytkownik może przyznać uprawnienia. W przeciwieństwie do uprawnień czasu działania nie ma wyskakującego okienka z prośbą o przyznanie uprawnień.
  7. Sprawdź odpowiedź użytkownika w metodzie onResume() – niezależnie od tego, czy zdecydował się przyznać czy odrzucił to specjalne uprawnienie.
  8. Jeśli użytkownik przyznał Twojej aplikacji uprawnienia, możesz uzyskać dostęp do jej prywatnych danych. Jeśli zamiast tego użytkownik odmówił przyznania uprawnień, grajnie zmniejsz komfort korzystania z aplikacji, tak aby udostępniała funkcje użytkownikom bez dostępu do informacji chronionych przez to uprawnienie.
Rysunek 2. Przepływ pracy deklarowania i wysyłania próśb o uprawnienia specjalne na Androidzie.

Poproś o uprawnienia specjalne

W odróżnieniu od uprawnień czasu działania 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 aplikację i uruchamia odpowiednią stronę ustawień dla danego uprawnienia specjalnego. Gdy użytkownik wróci do aplikacji, może ona sprawdzić, czy to uprawnienie zostało przyznane 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 pozwalający sprawdzić uprawnienia i podejmować decyzje użytkowników 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 dotyczące prośby o specjalne uprawnienia.

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

Uprawnienia specjalne działają inaczej niż uprawnienia w środowisku wykonawczym. Zamiast tego zapoznaj się z informacjami na temat interfejsu API uprawnień i użyj niestandardowych funkcji kontroli dostępu dla poszczególnych uprawnień specjalnych. Może to być na przykład AlarmManager#canScheduleExactAlarms() dla uprawnienia SCHEDULE_EXACT_ALARMS i Environment#isExternalStorageManager() dla uprawnienia MANAGE_EXTERNAL_STORAGE.

Żądanie w kontekście

Podobnie jak w przypadku uprawnień czasu działania, aplikacje powinny prosić o specjalne uprawnienia w kontekście, gdy użytkownik zażąda określonych działań, które ich wymagają. Na przykład poczekaj z prośbą o uprawnienie SCHEDULE_EXACT_ALARMS, dopóki użytkownik nie zaplanuje wysłania e-maila o określonej godzinie.

Wyjaśnij prośbę

Podaj uzasadnienie przed przekierowaniem do ustawień systemowych. Użytkownicy tymczasowo opuszczają aplikację, aby przyznać im specjalne uprawnienia, dlatego zanim wyświetlisz intencję na stronie Specjalny dostęp do aplikacji w ustawieniach systemu, wyświetl interfejs w aplikacji. Powinien on jasno wyjaśniać na stronie ustawień, dlaczego aplikacja potrzebuje tych uprawnień i w jaki sposób użytkownik powinien je przyznać.