Specjalne uprawnienia chronią dostęp do zasobów systemowych, które są szczególnie wrażliwe lub nie są bezpośrednio związane z prywatnością użytkownika. Te uprawnienia różnią się od uprawnień przyznawanych podczas instalacji i uprawnień przyznawanych w czasie działania.
Przykłady uprawnień specjalnych:
- planowanie precyzyjnych alarmów,
- Wyświetlanie i rysowanie nad innymi aplikacjami.
- dostęp do wszystkich danych w pamięci;
Aplikacje, które deklarują specjalne uprawnienia, są wyświetlane na stronie Aplikacje ze specjalnym dostępem w ustawieniach systemu (rysunek 1). Aby przyznać aplikacji specjalne uprawnienia, użytkownik musi otworzyć tę stronę: Ustawienia > Aplikacje > Specjalny dostęp do aplikacji.
Przepływ pracy
Aby poprosić o specjalne uprawnienia:
- W pliku manifestu aplikacji zadeklaruj uprawnienia specjalne, o które aplikacja może poprosić.
- Zaprojektuj interfejs użytkownika aplikacji tak, aby określone działania w aplikacji były powiązane z określonymi uprawnieniami specjalnymi. Informuj użytkowników, które działania mogą wymagać przyznania aplikacji uprawnień dostępu do prywatnych danych użytkownika.
- Poczekaj, aż użytkownik wywoła w aplikacji zadanie lub działanie, które wymaga dostępu do określonych prywatnych danych użytkownika. W tym momencie aplikacja może poprosić o specjalne uprawnienia wymagane do uzyskania dostępu do tych danych.
- Sprawdź, czy użytkownik przyznał już specjalne uprawnienia wymagane przez Twoją aplikację. W tym celu użyj funkcji sprawdzania niestandardowego każdego uprawnienia. Jeśli użytkownik wyrazi zgodę, aplikacja będzie mogła uzyskać dostęp do prywatnych danych użytkownika. Jeśli nie, przejdź do następnego. Uwaga: za każdym razem, gdy wykonujesz operację wymagającą uprawnień, musisz sprawdzić, czy je masz.
- Wyświetl użytkownikowi w elemencie interfejsu uzasadnienie, które jasno wyjaśnia, do jakich danych Twoja aplikacja próbuje uzyskać dostęp i jakie korzyści może przynieść użytkownikowi, jeśli przyzna on specjalne uprawnienia. Dodatkowo, ponieważ aplikacja przekierowuje użytkowników do ustawień systemu, aby przyznać uprawnienia, dołącz krótkie instrukcje, które wyjaśniają, jak użytkownicy mogą przyznać uprawnienia w tym miejscu. Interfejs uzasadnienia powinien zawierać wyraźną opcję rezygnacji z przyznania uprawnień. Gdy użytkownik potwierdzi, że rozumie uzasadnienie, przejdź do następnego kroku.
- Poproś o specjalne uprawnienia, których Twoja aplikacja potrzebuje, aby uzyskać dostęp do prywatnych danych użytkownika. Prawdopodobnie wiąże się to z intencją przejścia do odpowiedniej strony w ustawieniach systemu, na której użytkownik może przyznać uprawnienia. W przeciwieństwie do uprawnień przyznawanych w czasie działania nie ma okna z prośbą o przyznanie uprawnień.
- Sprawdź odpowiedź użytkownika – czy przyznał specjalne uprawnienia, czy odmówił ich przyznania – w metodzie onResume().
- Jeśli użytkownik przyznał aplikacji uprawnienia, możesz uzyskać dostęp do prywatnych danych użytkownika. Jeśli użytkownik odmówi przyznania uprawnień, przeprowadź łagodną degradację aplikacji, aby nadal udostępniać użytkownikowi funkcje bez informacji chronionych przez te uprawnienia.
Prośba o uprawnienia specjalne
W przeciwieństwie do uprawnień w czasie działania użytkownik musi przyznać specjalne uprawnienia na stronie Aplikacje ze specjalnym dostępem w ustawieniach systemu. Aplikacje mogą tam kierować 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, może ona sprawdzić, czy uprawnienie zostało przyznane, za pomocą funkcji onResume().
Poniższy 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(...)
    }
}
Wskazówki dotyczące zgłaszania próśb o uprawnienia specjalne
W sekcjach poniżej znajdziesz wskazówki i informacje, które warto wziąć pod uwagę, gdy prosisz o specjalne uprawnienia.
Każde uprawnienie ma własną metodę sprawdzania.
Uprawnienia specjalne działają inaczej niż uprawnienia czasu działania. Zamiast tego zapoznaj się ze stroną referencyjną interfejsu Permissions API i używaj funkcji niestandardowego sprawdzania dostępu
w przypadku każdego uprawnienia specjalnego. Przykłady to AlarmManager#canScheduleExactAlarms() w przypadku uprawnienia SCHEDULE_EXACT_ALARMS i Environment#isExternalStorageManager() w przypadku uprawnienia MANAGE_EXTERNAL_STORAGE.
Prośba w kontekście
Podobnie jak w przypadku uprawnień w czasie działania aplikacje powinny prosić o uprawnienia specjalne w kontekście, gdy użytkownik zażąda konkretnego działania, które wymaga tych uprawnień. Na przykład poczekaj z prośbą o uprawnienie SCHEDULE_EXACT_ALARMS, aż użytkownik zaplanuje wysłanie e-maila o określonej godzinie.
Wyjaśnij prośbę
Przed przekierowaniem do ustawień systemowych podaj uzasadnienie. Użytkownicy tymczasowo opuszczają aplikację, aby przyznać specjalne uprawnienia, dlatego przed uruchomieniem intencji przejścia na stronę Aplikacje ze specjalnym dostępem w ustawieniach systemu wyświetl interfejs w aplikacji. W tym interfejsie należy jasno wyjaśnić, dlaczego aplikacja potrzebuje uprawnień, i podać instrukcje, jak przyznać je na stronie ustawień.
