Usługi powiązane i uprawnienia
805
jesteś tutaj
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case PERMISSION_REQUEST_CODE: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Intent intent = new Intent(this, OdometerService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
} else {
// kod wykonywany, jeśli uprawnienie nie zostanie przydzielone
}
}
}
}
I w końcu, jeśli użytkownik nie zgodzi się na pobieranie informacji
o jego bieżącej lokalizacji, musimy go poinformować, że nasza aplikacja
Drogomierz nie będzie działać prawidłowo.
Sprawdzenie odpowiedzi na prośbę
Kiedy prosimy użytkownika o przydzielenie uprawnienia, używając metody
requestPermissions()
, to nie możemy określić, czy uprawnienie to zostało przydzielone,
czy nie, na podstawie wartości zwróconej przez wywołanie. Nie jest to możliwe, gdyż
prośba o uprawnienia jest wykonywana asynchronicznie, tak by bieżący wątek nie był
blokowany aż do momentu udzielenia odpowiedzi przez użytkownika.
Zamiast tego odpowiedź użytkownika jest sprawdzana poprzez przesłonięcie w klasie
aktywności metody
onRequestPermissionsResult()
. Metoda ta ma trzy parametry:
liczbę całkowitą określającą kod prośby o uprawnienia, tablicę łańcuchów znaków
określających uprawnienia oraz tablicę liczb całkowitych z rezultatami prośby.
Aby skorzystać z tej metody, w pierwszej kolejności trzeba sprawdzić, czy kod prośby
odpowiada temu przekazanemu w wywołaniu metody
requestPermissions()
.
Jeśli kod odpowiada, to możemy sprawdzić, czy uprawnienie zostało przydzielone.
Przedstawiony poniżej fragment kodu sprawdza, czy użytkownik przydzielił uprawnienie,
o które prosiliśmy przy użyciu metody
requestPermissions()
na poprzedniej stronie.
Jeśli uprawnienie zostało przydzielone, to tworzymy powiązanie aktywności z usługą
OdometerService
. Dodaj poniższą metodę do swojej wersji pliku MainActivity.java:
app/src/main
MainActivity.java
Drogomierz
java
com.hfad.drogomierz
Metoda onRequestPermissionsResult() zwraca
rezultat prośby o przydzielenie uprawnień.
Sprawdzamy, czy kod odpowiada kodowi
prośby przekazanemu w wywołaniu metody
requestPermissions().
Jeśli użytkownik
anulował żądanie,
to żadne wyniki nie
zostaną zwrócone.
Jeśli uprawnienie zostało
przydzielone, to tworzymy
powiązanie z usługą.
Ten kod dopiero musimy napisać.
¨
Prośba
¨
Przydzielone
¨
Prośba odrzucona
806
Rozdział 19.
Chcemy wyświetlić powiadomienie
¨
Prośba
¨
Przydzielone
¨
Prośba odrzucona
Jeśli użytkownik nie przydzielił
uprawnienia, wyświetlimy takie
powiadomienie.
Wyświetlenie powiadomienia
w razie odmowy przydzielenia uprawnienia
Jeśli użytkownik zdecydował się nie przydzielać uprawnienia do odczytu bieżącej
lokalizacji urządzenia, usługa
OdometerService
nie będzie w stanie wyznaczać
przebytego dystansu. W takim przypadku wyświetlimy powiadomienie informujące
użytkownika o zaistniałej sytuacji. Zdecydowaliśmy się na użycie powiadomienia,
gdyż pozostanie ono w systemowym obszarze powiadomień tak długo, aż użytkownik
postanowi coś z nim zrobić. Kolejną zaletą zastosowania powiadomienia jest to, że
możemy go użyć, by uruchomić aktywność
MainActivity
, kiedy użytkownik kliknie
powiadomienie. To z kolei oznacza wywołanie metody
onStart()
aktywności,
która ponownie wyświetli prośbę o przydzielenie uprawnienia (chyba że użytkownik
wcześniej zaznaczył opcję, by nie zadawać tego pytania ponownie).
Na następnej stronie jest zamieszczone ćwiczenie — wykonaj je, by sprawdzić,
czy potrafisz wygenerować powiadomienie.
P
: Wyłączyłem uprawnienia do określania lokalizacji
w trakcie działania aplikacji Drogomierz i wyświetlany
w niej dystans wrócił do początkowej wartości 0. Dlaczego?
O
:
Kiedy odbierzesz aplikacji uprawnienie do określania
lokalizacji, Android może usunąć proces, w ramach którego
aplikacja jest wykonywana. To przywróci początkowe wartości
wszystkich zmiennych.
P
: To brzmi strasznie. Czy są też inne sytuacje,
w których Android może usunąć proces?
O
:
Tak — kiedy ma mało pamięci, jednak będzie się przy tym
starał zachować działające te procesy, które są aktywnie używane.
P
: Dlaczego nie wywołujemy metody
requestPermissions()
z kodu usługi
OdometerService
?
O
:
Gdyż można jej używać wyłącznie w aktywnościach,
a nie w usługach.
P
: Czy mogę zmienić tekst wyświetlany w oknie
requestPermissions()
?
O
:
Nie. Test i opcje w oknie dialogowym są stałe, więc Android
nie pozwoli ich zmieniać.
P
: Ale chciałbym przekazać użytkownikom dodatkowe
informacje o tym, dlaczego proszę u uprawnienia.
Jak mogę to zrobić?
O
:
Jednym z rozwiązań jest wywołanie metody ActivityCompat.
shouldShowRequestPermissionRationale() przed
wywołaniem metody requestPermissions(). Metoda ta zwraca
true, jeśli użytkownik wcześniej odrzucił prośbę o przydzielenie
uprawnień i nie zaznaczył pola wyboru, by w przyszłości już jej nie
wyświetlać. W takim przypadku, jeszcze przed wyświetleniem okna
dialogowego z prośbą o przydzielenie uprawnień, możemy wyświetlić
użytkownikowi dodatkowe wyjaśnienia, ale poza tym oknem.
P
: Jakie inne uprawnienia wymagają zadeklarowania
i prośby o przydzielenie?
O
:
Ogólnie rzecz biorąc, uprawnienia są niezbędne w przypadku
operacji korzystających z prywatnych danych użytkownika lub
mogących mieć wpływ na działanie innych aplikacji. Dokumentacja
Androida dla każdej z klas powinna podawać niezbędne
uprawnienia; także Android Studio powinno informować o braku
niezbędnych uprawnień. Pełną listę czynności wymagających
uprawnień można znaleźć na stronie:
https://developer.android.com/guide/topics/permissions/
requesting.html#normal-dangerous
P
: Co się stanie, gdy stworzę aplikację wykonującą takie
operacje i nie poproszę w niej o przydzielenie uprawnień?
O
:
Jeśli docelowa wersja SDK odpowiada API poziomu 23. lub
wyższego i nie poprosisz o uprawnienia, to kod się nie skompiluje.
głupie pytania
Nie istnieją
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.