Zmienianie ustawień lokalizacji

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 za pomocą klienta ustawień sprawdzić, które ustawienia są włączone, i wyświetlać okno Ustawienia lokalizacji, w którym użytkownik może jednym kliknięciem zaktualizować ustawienia.

Skonfiguruj usługi lokalizacyjne

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 te 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 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 tylko Twoja aplikacja korzysta z szybszego otrzymywania aktualizacji niż określono w setInterval(), 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 żądać dokładności lokalizacji z dokładnością do około 100 metrów. Jest to uważane za dokładność gruboziarnistą i prawdopodobnie wiąże się z mniejszym zużyciem energii. Gdy to ustawienie jest włączone, usługi lokalizacyjne zwykle korzystają z określania położenia na sieci Wi-Fi i masztów telefonii komórkowej. Pamiętaj jednak, że wybór dostawcy danych o 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 żądać dokładnej lokalizacji na poziomie miasta (dokładność do około 10 kilometrów). 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_LOCATIONzdefiniowanymi 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. To dostosowanie uniemożliwia aplikacji otrzymywanie aktualizacji, których nie może używać. Po zakończeniu długotrwałej pracy ustaw najkrótszy 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 obiekt LocationSettingsRequest.Builder i dodaj co najmniej 1 prośbę o lokalizację. 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 są aktualne ustawienia lokalizacji:

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ę getLocationSettingsStates() obiektu LocationSettingsResponse.

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 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.