Jeśli aplikacja musi prosić o dostęp do lokalizacji lub otrzymywać aktualizacje uprawnień, na urządzeniu trzeba włączyć odpowiednie ustawienia systemowe, takie jak GPS lub skanowanie 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
żądany interwał aktualizacji, a urządzenie automatycznie wprowadza odpowiednie
zmiany w ustawieniach systemowych. Te ustawienia są zdefiniowane przez
LocationRequest
obiekt danych.
Z tego samouczka dowiesz się, jak za pomocą klienta ustawień sprawdzić, które ustawienia są włączone, i wyświetlić okno ustawień 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 dostawcę uśrednionej 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 żądania lokalizacji
Aby przechowywać parametry żądań do dostawcy uśrednionej lokalizacji, utwórz
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 tym samouczku ustawiamy interwał aktualizacji, najszybszy interwał
aktualizacji i priorytet, jak opisano poniżej:
- Przerwa aktualizacji
-
setIntervalMillis()– ta metoda ustawia w milisekundach częstotliwość, z jaką aplikacja ma otrzymywać aktualizacje lokalizacji. Pamiętaj, że aktualizacje lokalizacji mogą być nieco szybsze lub wolniejsze niż ta częstotliwość, aby zoptymalizować wykorzystanie baterii, albo mogą nie być w ogóle (np. jeśli urządzenie nie ma połączenia). - Najszybszy interwał
-
setMinUpdateIntervalMillis()– ta metoda ustawia najszybszą częstotliwość w milisekundach, z którą aplikacja może obsługiwać aktualizacje lokalizacji. Nie musisz wywoływać tej metody, chyba że aplikacja korzysta z szybszego otrzymywania aktualizacji niż częstotliwość określona wsetInterval(). - Priorytet
-
setPriority()– ta metoda ustawia priorytet żądania, który daje usługom lokalizacyjnym Usług Google Play wyraźną wskazówkę, z jakich źródeł lokalizacji korzystać. Obsługiwane są te wartości:-
PRIORITY_BALANCED_POWER_ACCURACY– użyj tego ustawienia, aby poprosić o dokładność lokalizacji do bloku miejskiego, czyli około 100 metrów. Jest to uważane za niski poziom dokładności i prawdopodobnie zużywa mniej energii. W przypadku tego ustawienia usługi lokalizacyjne prawdopodobnie będą korzystać z Wi-Fi i pozycjonowania za pomocą stacji bazowych. Pamiętaj jednak, że wybór dostawcy lokalizacji zależy od wielu innych czynników, np. od tego, które źródła są dostępne. -
PRIORITY_HIGH_ACCURACY– użyj tego ustawienia, aby poprosić o jak najdokładniejszą lokalizację. W przypadku tego ustawienia usługi lokalizacyjne prawdopodobnie będą korzystać z GPS do określania lokalizacji. PRIORITY_LOW_POWER– użyj tego ustawienia, aby poprosić o precyzję na poziomie miasta, czyli dokładność około 10 kilometrów. Jest to uważane za niski poziom dokładności i 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. W przypadku tego ustawienia 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ładem kodu:
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 uprawnienia
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 aplikacja uzyskuje dostęp do sieci lub wykonuje inne długotrwałe zadania po otrzymaniu informacji o zmianie lokalizacji, dostosuj najszybszy interwał do mniejszej wartości. Dzięki temu aplikacja nie będzie otrzymywać aktualizacji, których nie może użyć. Po zakończeniu długotrwałego zadania, ustaw najszybszy interwał z powrotem na szybką wartość.
Pobieranie bieżących ustawień lokalizacji
Po połączeniu z Usługami Google Play i interfejsem API usług lokalizacyjnych
możesz pobrać bieżące ustawienia lokalizacji urządzenia użytkownika. Aby to zrobić, utwórz LocationSettingsRequest.Builder i dodaj co najmniej 1 żądanie lokalizacji. Ten 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ą odpowiednie:
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, sprawdzając kod stanu z obiektu LocationSettingsResponse. Aby uzyskać jeszcze więcej szczegółów 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
OnFailureListener do
Task obiektu, który sprawdza ustawienia lokalizacji. Następnie sprawdź
czy obiekt
Exception przekazany do metody
onFailure() jest instancją klasy
ResolvableApiException, co oznacza, że ustawienia
trzeba zmienić. Następnie wyświetl okno, w którym poprosisz użytkownika o zgodę na
modyfikowanie ustawień lokalizacji, wywołując
startResolutionForResult().
Ten fragment kodu pokazuje, jak sprawdzić, czy ustawienia lokalizacji użytkownika pozwalają usługom lokalizacyjnym utworzyć
LocationRequest, oraz jak w razie potrzeby poprosić użytkownika o zgodę na zmianę ustawień lokalizacji:
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. } } } });
Z następnego samouczka, Prośba o aktualizacje lokalizacji, dowiesz się, jak otrzymywać okresowe aktualizacje lokalizacji.