Zmienianie ustawień lokalizacji

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 w setInterval(), 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.