Jeśli aplikacja musi poprosić o lokalizację lub o aktualizację 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/zużycia energii oraz pożądany interwał aktualizacji, a urządzenie automatycznie wprowadza odpowiednie zmiany w ustawieniach systemu. Te ustawienia są definiowane przez obiekt danych LocationRequest
.
Z tej lekcji dowiesz się, jak użyć klienta ustawień, aby sprawdzić, które ustawienia są włączone, i jak wyświetlić użytkownikowi okno ustawień lokalizacji, aby mógł zaktualizować ustawienia jednym kliknięciem.
Konfigurowanie usług lokalizacyjnych
Aby korzystać z usług lokalizacyjnych oferowanych przez Usługi Google Play i połączonego dostawcy lokalizacji, połącz aplikację za pomocą klienta ustawień. 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 zastosowań tych funkcji.
Konfigurowanie prośby o lokalizację
Aby przechowywać parametry żądań do dostawcy z połączonych danych o lokalizacji, utwórz LocationRequest
.
Parametry określają poziom dokładności żądań dotyczących lokalizacji. Szczegółowe informacje o wszystkich dostępnych opcjach żądania lokalizacji znajdziesz w dokumentacji klasy LocationRequest
. W tej lekcji możesz ustawić interwał aktualizacji, najszybszy interwał aktualizacji i priorytet w następujący sposób:
- Interwał aktualizacji
-
setInterval()
- Ta metoda ustawia częstotliwość w milisekundach, z jaką aplikacja preferuje otrzymywać aktualizacje lokalizacji. Pamiętaj, że aktualizacje lokalizacji mogą być nieco szybsze lub wolniejsze od tej wartości, aby zoptymalizować zużycie baterii. Mogą też w ogóle nie występować (np. jeśli urządzenie nie ma połączenia). - Najszybszy interwał aktualizacji
-
setFastestInterval()
- Ta metoda ustawia najszybszą częstotliwość w milisekundach, z jaką aplikacja może obsługiwać aktualizacje lokalizacji. Jeśli Twoja aplikacja nie korzysta z częstszych aktualizacji niż określone wsetInterval()
, nie musisz wywoływać tej metody. - Priorytet
-
setPriority()
- ta metoda ustawia priorytet żądania, co daje usługom lokalizacyjnym Google Play wyraźną wskazówkę, których źródeł lokalizacji użyć. Obsługiwane są następujące wartości:-
PRIORITY_BALANCED_POWER_ACCURACY
– Użyj tego ustawienia, aby poprosić o dokładność lokalizacji na poziomie kwartału, co odpowiada dokładności około 100 metrów. Jest to uważane za dokładność na niskim poziomie i prawdopodobnie wiąże się z mniejszym zużyciem energii. Przy tym ustawieniu usługi lokalizacyjne prawdopodobnie korzystają z sieci Wi-Fi i lokalizacji stacji bazowej. 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 wysłać żądanie dokładnej lokalizacji. Dzięki temu ustawieniu usługi lokalizacji będą częściej używać GPS-a do określania lokalizacji. PRIORITY_LOW_POWER
- Użyj tego ustawienia, aby poprosić o dokładność na poziomie miasta, która wynosi około 10 km. Jest to poziom dokładności uznawany za wystarczający, a jednocześnie prawdopodobnie wiąże się z mniejszym zużyciem energii.PRIORITY_NO_POWER
– Użyj tego ustawienia, jeśli chcesz mieć niewielki wpływ na zużycie energii, ale chcesz otrzymywać aktualizacje lokalizacji, gdy są dostępne. Przy tym ustawieniu aplikacja nie powoduje żadnych aktualizacji lokalizacji, ale otrzymuje informacje o lokalizacji 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() .setIntervalMillis(10000) .setFastestIntervalMillis(5000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .build() }
Java
protected void createLocationRequest() { LocationRequest locationRequest = LocationRequest.Builder() .setIntervalMillis(10000) .setFastestIntervalMillis(5000) .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .build(); }
PriorytetPRIORITY_HIGH_ACCURACY
w połączeniu z uprawnieniamiACCESS_FINE_LOCATION
zdefiniowanymi w pliku manifestu aplikacji oraz szybkim interwałem aktualizacji wynoszącym 5000 ms (5 sekund) sprawiają, że zespolone dane o lokalizacji od dostawcy zwracają aktualizacje lokalizacji o dokładności kilku metrów.
Takie podejście jest odpowiednie w przypadku aplikacji mapowych, które wyświetlają lokalizację w czasie rzeczywistym.
Wskazówka dotycząca wydajności: jeśli po otrzymaniu aktualizacji lokalizacji Twoja aplikacja uzyskuje dostęp do sieci lub wykonuje inne długotrwałe operacje, zmień najszybszy interwał na wolniejszy. Ta zmiana uniemożliwia aplikacji otrzymywanie aktualizacji, których nie może użyć. Po zakończeniu długotrwałej pracy ustaw najszybszy interwał z powrotem na szybką wartość.
Pobieranie bieżących ustawień lokalizacji
Po nawiązaniu połączenia z usługami Google Play i interfejsem API usług lokalizacji możesz uzyskać 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ą 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());
Po zakończeniu działania wywołania Task
aplikacja może sprawdzić ustawienia lokalizacji, sprawdzając kod stanu obiektu LocationSettingsResponse
. Aby uzyskać jeszcze więcej informacji o bieżącym stanie odpowiednich ustawień lokalizacji, aplikacja może wywołać metodę obiektu LocationSettingsResponse
getLocationSettingsStates()
.
Prośba o zmianę ustawień lokalizacji
Aby określić, czy ustawienia lokalizacji są odpowiednie dla żądania lokalizacji, dodaj obiekt
OnFailureListener
do obiektu
Task
, który weryfikuje ustawienia lokalizacji. Następnie sprawdź, czy obiekt
Exception
przekazany metodzie
onFailure()
jest wystąpieniem klasy
ResolvableApiException
, co oznacza, że ustawienia muszą zostać zmienione. Następnie wyświetl okno z prośbą o pozwolenie na modyfikowanie ustawień lokalizacji, wywołując metodę
startResolutionForResult()
.
Ten fragment kodu pokazuje, jak określić, czy ustawienia lokalizacji użytkownika zezwalają usługom lokalizacji na tworzenie
LocationRequest
, a także jak poprosić użytkownika o zezwolenie na zmianę ustawień lokalizacji w razie potrzeby:
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ępnym samouczku Otrzymywanie aktualizacji lokalizacji dowiesz się, jak otrzymywać okresowe aktualizacje lokalizacji.