Zmienianie ustawień lokalizacji

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