Jeśli aplikacja musi poprosić o dostęp do lokalizacji lub otrzymywać aktualizacje uprawnień, na urządzeniu muszą być włączone odpowiednie ustawienia systemowe, takie jak skanowanie GPS lub Wi-Fi. Zamiast bezpośrednio włączać usługi, takie jak GPS urządzenia, aplikacja określa wymagany poziom dokładności lub zużycia energii oraz pożądany interwał aktualizacji, a urządzenie automatycznie wprowadza odpowiednie zmiany w ustawieniach systemu. Te ustawienia są zdefiniowane przez obiekt danych LocationRequest
.
Z tego filmu dowiesz się, jak za pomocą klienta ustawień sprawdzić, które ustawienia są włączone, i wyświetlić okno dialogowe Ustawienia lokalizacji, aby użytkownik mógł zaktualizować ustawienia jednym kliknięciem.
Konfigurowanie usług lokalizacyjnych
Aby korzystać z usług lokalizacyjnych udostępnianych przez Usługi Google Play i zintegrowanego dostawcę lokalizacji, połącz aplikację za pomocą klienta ustawień, a następnie sprawdź bieżące ustawienia lokalizacji i w razie potrzeby poproś użytkownika o włączenie wymaganych ustawień.
Aplikacje, których funkcje korzystają z usług lokalizacyjnych, muszą prosić o dostęp do lokalizacji w zależności od przypadków użycia tych funkcji.
Konfigurowanie prośby o lokalizację
Aby przechowywać parametry żądań do połączonego dostawcy lokalizacji, utwórz obiekt LocationRequest
.
Parametry określają poziom dokładności żądań lokalizacji. Szczegółowe informacje o wszystkich dostępnych opcjach żądania lokalizacji znajdziesz w dokumentacji klasy LocationRequest
. W tej lekcji ustawisz interwał aktualizacji, najszybszy interwał aktualizacji i priorytet, jak opisano poniżej:
- Przerwa między aktualizacjami
-
setIntervalMillis()
– ta metoda określa w milisekundach częstotliwość, z jaką aplikacja woli otrzymywać aktualizacje lokalizacji. Pamiętaj, że aktualizacje lokalizacji mogą być nieco szybsze lub wolniejsze niż ta częstotliwość, aby zoptymalizować zużycie baterii. Może też nie być żadnych aktualizacji (np. jeśli urządzenie nie ma połączenia). - Najszybszy interwał aktualizacji
-
setMinUpdateIntervalMillis()
– ta metoda ustawia najszybszą częstotliwość w milisekundach, z jaką aplikacja może obsługiwać aktualizacje lokalizacji. Jeśli Twoja aplikacja nie korzysta z szybszego otrzymywania aktualizacji niż w przypadku częstotliwości określonej wsetInterval()
, nie musisz wywoływać tej metody. - Priorytet
-
setPriority()
– ta metoda ustawia priorytet żądania, co daje usługom lokalizacyjnym Usług Google Play silną wskazówkę, z których źródeł lokalizacji korzystać. Obsługiwane są te wartości:-
PRIORITY_BALANCED_POWER_ACCURACY
– Użyj tego ustawienia, aby poprosić o dokładność lokalizacji w obrębie bloku miejskiego, czyli o dokładność około 100 metrów. Jest to uważane za niski poziom dokładności i prawdopodobnie zużywa mniej energii. W tym ustawieniu usługi lokalizacyjne prawdopodobnie będą korzystać z pozycjonowania za pomocą Wi-Fi i stacji bazowych. Pamiętaj jednak, że wybór dostawcy lokalizacji zależy od wielu innych czynników, takich jak dostępne źródła. -
PRIORITY_HIGH_ACCURACY
– użyj tego ustawienia, aby wysyłać żądanie jak najdokładniejszej lokalizacji. Gdy to ustawienie jest włączone, usługi lokalizacyjne częściej korzystają z GPS-u do określania lokalizacji. PRIORITY_LOW_POWER
– Użyj tego ustawienia, aby poprosić o dokładność na poziomie miasta, czyli około 10 kilometrów. Jest to przybliżony poziom dokładności, który prawdopodobnie zużywa mniej energii.PRIORITY_PASSIVE
– Użyj tego ustawienia, jeśli chcesz, aby zużycie energii było znikome, ale chcesz otrzymywać aktualizacje lokalizacji, gdy są dostępne. Dzięki temu ustawieniu aplikacja nie wywołuje żadnych aktualizacji lokalizacji, ale otrzymuje lokalizacje wywołane przez inne aplikacje.
-
Utwórz żądanie lokalizacji i ustaw parametry zgodnie z tym przykładowym kodem:
Kotlin
fun createLocationRequest() { val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build() }
Java
protected void createLocationRequest() { LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build(); }
Priorytet PRIORITY_HIGH_ACCURACY
w połączeniu z ustawieniem uprawnień ACCESS_FINE_LOCATION
zdefiniowanym w pliku manifestu aplikacji oraz szybkim interwałem aktualizacji wynoszącym 5000 milisekund (5 sekund) powoduje, że połączony dostawca lokalizacji zwraca aktualizacje lokalizacji z dokładnością do kilku metrów.
To podejście jest odpowiednie w przypadku aplikacji do mapowania, które wyświetlają lokalizację w czasie rzeczywistym.
Wskazówka dotycząca wydajności: jeśli po otrzymaniu aktualizacji lokalizacji aplikacja uzyskuje dostęp do sieci lub wykonuje inne długotrwałe zadania, dostosuj najkrótszy interwał do mniejszej wartości. Dzięki temu Twoja aplikacja nie będzie otrzymywać aktualizacji, których nie może używać. Po zakończeniu długotrwałej pracy przywróć najszybszy interwał.
Pobieranie bieżących ustawień lokalizacji
Po połączeniu z Usługami Google Play i interfejsem API usług lokalizacyjnych
możesz uzyskać aktualne ustawienia lokalizacji na urządzeniu użytkownika. Aby to zrobić, utwórz LocationSettingsRequest.Builder
i dodaj co najmniej 1 prośbę o lokalizację. Poniższy fragment kodu pokazuje, jak dodać żądanie lokalizacji utworzone w poprzednim kroku:
Kotlin
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
Następnie sprawdź, czy bieżące ustawienia lokalizacji są prawidłowe:
Kotlin
val builder = LocationSettingsRequest.Builder() // ... val client: SettingsClient = LocationServices.getSettingsClient(this) val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
Java
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); // ... SettingsClient client = LocationServices.getSettingsClient(this); Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
Gdy Task
zostanie ukończone, aplikacja może sprawdzić ustawienia lokalizacji, analizując kod stanu z obiektu LocationSettingsResponse
. Aby uzyskać jeszcze więcej informacji o bieżącym stanie odpowiednich ustawień lokalizacji, aplikacja może wywołać metodę getLocationSettingsStates()
obiektu LocationSettingsResponse
.
Prośba o zmianę ustawień lokalizacji
Aby określić, czy ustawienia lokalizacji są odpowiednie dla żądania lokalizacji, dodaj do obiektu
Task
element
OnFailureListener
, który weryfikuje ustawienia lokalizacji. Następnie sprawdź, czy obiekt
Exception
przekazany do metody
onFailure()
jest instancją klasy
ResolvableApiException
, co oznacza, że ustawienia
muszą zostać zmienione. Następnie wyświetl okno z prośbą o zezwolenie na modyfikowanie ustawień lokalizacji, wywołując funkcję
startResolutionForResult()
.
Poniższy fragment kodu pokazuje, jak sprawdzić, czy ustawienia lokalizacji użytkownika zezwalają usługom lokalizacyjnym na utworzenie obiektu
LocationRequest
, a także jak poprosić użytkownika o zezwolenie na zmianę ustawień lokalizacji, jeśli jest to konieczne:
Kotlin
task.addOnSuccessListener { locationSettingsResponse -> // All location settings are satisfied. The client can initialize // location requests here. // ... } task.addOnFailureListener { exception -> if (exception is ResolvableApiException){ // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). exception.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS) } catch (sendEx: IntentSender.SendIntentException) { // Ignore the error. } } }
Java
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // All location settings are satisfied. The client can initialize // location requests here. // ... } }); task.addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { if (e instanceof ResolvableApiException) { // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // Ignore the error. } } } });
W następnej lekcji Żądanie aktualizacji lokalizacji dowiesz się, jak okresowo otrzymywać aktualizacje lokalizacji.