Specjalne uprawnienie 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ń na czas instalacji i uprawnień na czas działania.
Przykłady specjalnych uprawnień:
- planowania precyzyjnych alarmów;
- wyświetlanie i rysowanie nad innymi aplikacjami,
- Dostęp do wszystkich danych pamięci.
Aplikacje, które deklarują specjalne uprawnienia, są widoczne na stronie Specjalny dostęp do aplikacji w ustawieniach systemu (ryc. 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:
- W pliku manifestu aplikacji zadeklaruj specjalne uprawnienia, których może potrzebować Twoja aplikacja.
- Zaprojektuj UX aplikacji tak, aby określone działania w aplikacji były powiązane z konkretnymi uprawnieniami specjalnymi. Poinformuj użytkowników, które działania mogą wymagać od nich udzielenia Twojej aplikacji dostępu do prywatnych danych.
- Zaczekaj, 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 uprawnienie wymagane do uzyskania dostępu do tych danych.
- Sprawdź, czy użytkownik już przyznał uprawnienia specjalne, których wymaga Twoja aplikacja. Aby to zrobić, użyj własnej funkcji sprawdzania każdego uprawnienia. Jeśli udzielisz zgody, aplikacja będzie mieć dostęp do prywatnych danych użytkownika. Jeśli nie, przejdź do następnego. Uwaga: za każdym razem, gdy wykonujesz operację wymagającą tego uprawnienia, musisz sprawdzić, czy je masz.
- Pokaż użytkownikowi uzasadnienie w elementach interfejsu, które jasno określają, do jakich danych ma dostęp Twoja aplikacja i jakie korzyści może ona zapewnić użytkownikowi, jeśli ten przyzna specjalne uprawnienia. Ponieważ aplikacja wysyła użytkowników do ustawień systemu, aby przyznać uprawnienia, dołącz do niej krótkie instrukcje wyjaśniające, jak użytkownicy mogą to zrobić. Interfejs logowania powinien zawierać opcję umożliwiającą użytkownikowi odmowę udzielenia uprawnień. Gdy użytkownik zaakceptuje uzasadnienie, przejdź do następnego kroku.
- Poproś o specjalne uprawnienie, którego aplikacja wymaga do uzyskania dostępu do prywatnych danych użytkownika. Prawdopodobnie jest to związane z intencją dotyczącą odpowiedniej strony w ustawieniach systemu, na której użytkownik może przyznać uprawnienie. W przeciwieństwie do uprawnień w czasie działania nie wyświetla się wyskakujące okienko z prośbą o uprawnienia.
- Sprawdź odpowiedź użytkownika (czy przyznał on uprawnienia specjalne) 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 udzielenia zgody, łagodnie ogranicz funkcjonalność aplikacji, aby oferowała ona użytkownikowi funkcje bez informacji chronionych przez to uprawnienie.
Proś o uprawnienia specjalne
W odróżnieniu od uprawnień czasu działania użytkownik musi przyznać specjalne uprawnienia na stronie Aplikacje ze specjalnym dostępem w ustawieniach systemu. Aplikacje mogą wysyłać użytkowników do tej strony za pomocą intencji, która wstrzymuje aplikację i uruchamia odpowiednią stronę ustawień dla danego specjalnego uprawnienia.
Gdy użytkownik wróci do aplikacji, aplikacja może sprawdzić, czy uprawnienia zostały przyznane w ramach 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 plikach 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 następnych sekcjach znajdziesz sprawdzone metody i wskazówki dotyczące żądania specjalnych uprawnień.
Każde uprawnienie ma własną metodę sprawdzania.
Uprawnienia specjalne działają inaczej niż uprawnienia w czasie wykonywania. Zamiast tego odwiedź stronę z informacjami o interfejsie API uprawnień i użyj niestandardowych funkcji sprawdzania dostępu w przypadku każdego specjalnego uprawnienia. Przykłady to:AlarmManager#canScheduleExactAlarms()
w przypadku uprawnieńSCHEDULE_EXACT_ALARMS
i Environment#isExternalStorageManager()
w przypadku uprawnieńMANAGE_EXTERNAL_STORAGE
.
Prośba o kontekst
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ń. Na przykład zaczekaj, aż użytkownik zaplanowa wyślij e-maila w określonym czasie, a potem poproś o dostęp SCHEDULE_EXACT_ALARMS
.
Wyjaśnienie prośby
Przed przekierowaniem do ustawień systemu podaj uzasadnienie. Użytkownicy czasowo opuszczają aplikację, aby przyznać specjalne uprawnienia, dlatego przed uruchomieniem intencji w celu wyświetlenia strony Aplikacje ze specjalnym dostępem w ustawieniach systemu wyświetl interfejs aplikacji. W interfejsie należy wyraźnie wyjaśnić, dlaczego aplikacja potrzebuje uprawnienia i jak użytkownik może je przyznać na stronie ustawień.