802
Rozdział 19.
Prośba o uprawnienie
Jak poprosić o uprawnienia z poziomu aplikacji?
Jak na razie usługa
OdometerService
sprawdza, czy aplikacja posiada uprawnienie do
określania dokładnej lokalizacji. Jeśli użytkownik przydzielił to uprawnienie, to nasza
usługa skorzysta z usługi lokalizacyjnej Androida, by śledzić dystans przebyty przez
urządzenie. Ale co się stanie, jeśli uprawnienie
nie zostało przydzielone?
Jeśli aplikacja nie będzie posiadać uprawnienia do określania dokładnej lokalizacji
urządzenia, to usługa
OdometerService
nie będzie mogła skorzystać z usług
lokalizacyjnych niezbędnych do jej prawidłowego działania. Jednak zamiast po prostu
zaakceptować ten stan rzeczy, aplikacja może zrobić coś lepszego — może poprosić
użytkownika o przydzielenie uprawnienia.
Zmienimy zatem aktywność
MainActivity
w taki sposób, by w przypadku,
gdy wymagane uprawnienie nie zostało przydzielone, aplikacja go zażądała.
W tym celu będziemy musieli wykonać w aktywności
MainActivity
trzy operacje:
Zaczniemy od sprawdzenia, w jaki sposób możemy poprosić
o przydzielenie uprawnienia w trakcie działania aplikacji.
Zanim aktywność utworzy powiązanie z usługą, zażądać przydzielenia uprawnienia
ACCESS_FINE_LOCATION, jeśli użytkownik jeszcze go nie przydzielił.
Spowoduje to wyświetlenie na ekranie okna dialogowego z prośbą o przydzielenie uprawnienia.
Sprawdzić odpowiedź i utworzyć powiązanie z usługą, jeśli uprawnienie
zostało przydzielone.
Wyświetlić stosowny komunikat, jeśli użytkownik nie przydzielił uprawnienia.
To okno dialogowe jest wyświetlane,
kiedy aplikacja w trakcie swego
działania poprosi o przydzielenie
uprawnienia ACCESS_FINE_LOCATION.
Jeśli użytkownik nie przydzielił
niezbędnego uprawnienia,
wyświetlimy stosowne
powiadomienie.
1
2
3
Usługi powiązane i uprawnienia
803
jesteś tutaj
Sprawdzanie uprawnień w trakcie działania
We wcześniejszej części rozdziału dowiedziałeś się, jak — używając
metody
ContextCompat.checkSelfPermission()
— można sprawdzać,
czy aplikacji zostało przydzielone konkretne uprawnienie:
if (ContextCompat.checkSelfPermission(this, PERMISSION_STRING)
== PackageManager.PERMISSION_GRANTED) {
// tu wykonujemy kod wymagający uprawnienia
}
Jeśli użytkownik przydzielił uprawnienie, to metoda zwraca wartość
PackageManager.PERMISSION_GRANTED
, a kod wymagający danego
uprawnienia zostanie prawidłowo wykonany. A co w przypadku, gdy
uprawnienie nie zostało przydzielone?
Prośba o uprawnienie, które nie zostało przydzielone
Jeśli użytkownik nie przydzielił jednego lub kilku uprawnień niezbędnych
do działania kodu, można skorzystać z metody
ActivityCompat.
requestPermissions()
, by poprosić o te uprawnienia w trakcie działania
aplikacji.
ActivityCompat
to klasa pochodząca z biblioteki wsparcia
AppCompat, zapewniająca zgodność wstecz ze starszymi wersjami systemu
Android. Metoda
requestPermissions()
tej klasy ma trzy parametry:
obiekt
Context
(zazwyczaj jest to referencja
this
), tablice łańcuchów
znaków określających uprawnienia, o które aplikacja chce poprosić,
oraz wartość typu
int
, określającą kod prośby o uprawnienia. Poniżej
pokazaliśmy, w jaki sposób należałoby użyć tej metody do poproszenia
użytkownika o przydzielenie uprawnienia
ACCESS_FINE_LOCATION
:
ActivityCompat.requestPermissions(this,
new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 6854);
Wywołanie metody
requestPermissions()
powoduje wyświetlenie jednego lub
kilku okien dialogowych, z których każde będzie prezentować prośbę o przydzielenie
jednego uprawnienia. Okno zapewnia użytkownikowi możliwość przydzielenia
uprawnienia lub odrzucenia prośby, zawiera także pole wyboru, które użytkownik
może zaznaczyć, jeśli nie chce już więcej być pytany o dane uprawnienie.
Jeśli użytkownik zaznaczy to pole i odrzuci prośbę o przydzielenie uprawnienia,
to późniejsze wywołania metody
requestPermissions()
nie będą już powodować
wyświetlania okna dialogowego.
Trzeba zwrócić uwagę na to, że metodę
requestPermissions()
można wywoływać
wyłącznie w kodzie aktywności. Nie można prosić o przydzielanie uprawnień
z poziomu usług.
Zmodyfikujemy teraz aktywność
MainActivity
w taki sposób, by prosiła
o przydzielenie uprawnienia do określania dokładnej lokalizacji, jeśli użytkownik
nie zrobił tego wcześniej.
Metodę requestPermissions()
można wywołać jedynie
z poziomu aktywności.
Nie można jej stosować
w usługach.
Ten kod sprawdza, czy
użytkownik przydzielił
uprawnienie.
Używaj tej
metody, by prosić
o przydzielanie
uprawnień
w trakcie
działania
aplikacji.
To jest kod prośby o uprawnienia.
Może on być dowolną liczbą
całkowitą. Już niebawem, za
kilka stron, zobaczysz, gdzie ten
kod będzie używany.
To jest okno dialogowe z prośbą
o przydzielenie uprawnienia.
Korzystając z tych opcji, użytkownik
może przydzielić uprawnienie lub
odrzucić prośbę.
¨
Prośba
¨
Przydzielone
¨
Prośba odrzucona
804
Rozdział 19.
Metoda onStart()
Sprawdzanie uprawnienia dostępu
do lokalizacji w metodzie onStart() aktywności
Obecnie używamy metody
onStart()
aktywności
MainActivity
do
powiązania aktywności z usługą
OdometerService
. Zmienimy jednak jej kod
w taki sposób, by powiązanie z usługą było tworzone wyłącznie w przypadku,
gdy użytkownik udzielił uprawnienia określonego przy użyciu stałej
PERMISSION_STRING
, którą zdefiniowaliśmy w usłudze
OdometerService
.
Jeśli użytkownik nie przydzielił tego uprawnienia, to poprosimy o nie.
Poniżej przedstawiliśmy zmodyfikowany kod pliku
MainActivity.java;
zaktualizuj swoją wersję tego pliku, by była identyczna z naszą:
...
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
public class MainActivity extends Activity {
...
private final int PERMISSION_REQUEST_CODE = 698;
...
@Override
protected void onStart() {
super.onStart();
if (ContextCompat.checkSelfPermission(this, OdometerService.PERMISSION_STRING)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{OdometerService.PERMISSION_STRING},
PERMISSION_REQUEST_CODE);
} else {
Intent intent = new Intent(this, OdometerService.class);
bindService(intent, connection, Context.BIND_AUTO_CREATE);
}
}
}
Skoro już poprosiliśmy użytkownika o przydzielenie uprawnienia, musimy
sprawdzić jego odpowiedź. Zajmiemy się tym za chwilę.
Używamy tych dodatkowych
klas, więc musimy je
zaimportować.
Tej liczby całkowitej użyjemy jako
kodu prośby o uprawnienie.
Jeśli uprawnienia nie zostałyjeszcze przydzielone…
…poprosimy o nie w trakcie działania aplikacji.
Jeśli uprawnienie zostało już
przydzielone, to tworzymy
powiązanie z usługą.
app/src/main
Main
Activity.java
Drogomierz
java
com.hfad.drogomierz
¨
Prośba
¨
Przydzielone
¨
Prośba odrzucona
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.