Zmienianie ustawień lokalizacji

Jeśli aplikacja musi prosić o dostęp do lokalizacji lub otrzymywać aktualizacje uprawnień, urządzenie musi włączyć odpowiednie ustawienia systemu, 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życie energii i oczekiwany odstęp czasu 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 udostępnianych przez Usługi Google Play oraz dostawcę uśrednionej lokalizacji, połącz aplikację za pomocą klienta ustawień, a potem sprawdź bieżące ustawienia lokalizacji i poproś użytkownika o włączenie wymaganych ustawień, jeśli to konieczne.

Aplikacje, których funkcje korzystają z usług lokalizacyjnych, muszą poprosić o dostęp do lokalizacji zależnie od ich zastosowania.

Skonfiguruj prośbę o lokalizację

Aby przechowywać parametry żądań wysyłanych do dostawcy uśrednionej lokalizacji, utwórz LocationRequest. Parametry te określają poziom dokładności żądań lokalizacji. Szczegółowe informacje o wszystkich dostępnych opcjach próśb o lokalizację znajdziesz w dokumentacji klas LocationRequest. Ta lekcja ustawia interwał aktualizacji, najkrótszy odstęp czasu aktualizacji i priorytet zgodnie z poniższym opisem:

Przerwa aktualizacji
setInterval() – ta metoda ustawia w milisekundach szybkość, z jaką aplikacja ma otrzymywać aktualizacje lokalizacji. Pamiętaj, że w celu optymalizacji pod kątem wykorzystania baterii aktualizacje lokalizacji mogą być aktualizowane nieco szybciej lub wolniej. Możliwe też, że aktualizacje w ogóle nie będą dostępne (np. gdy urządzenie nie ma połączenia z internetem).
Najszybszy interwał aktualizacji
setFastestInterval() – ta metoda ustawia najszybszą szybkość w milisekundach, z jaką aplikacja może obsługiwać aktualizacje lokalizacji. Nie musisz wywoływać tej metody, chyba że Twoja aplikacja uzyskuje aktualizacje szybciej niż wynosi częstotliwość określona w zasadzie setInterval().
Priorytet

setPriority() – ta metoda ustala priorytet żądania, dzięki czemu usługi lokalizacyjne Usług Google Play mają wyraźną wskazówkę, których źródeł lokalizacji mają użyć. Obsługiwane są te 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. Uważa się to za przybliżony poziom dokładności, który może zużywać mniej energii. Gdy to ustawienie jest włączone, usługi lokalizacyjne zwykle korzystają z określania lokalizacji Wi-Fi i masztów telefonii komórkowej. Pamiętaj jednak, że wybór dostawcy lokalizacji zależy od wielu innych czynników, np. od dostępnych źródeł.
  • PRIORITY_HIGH_ACCURACY – użyj tego ustawienia, aby poprosić o najdokładniejszą możliwą lokalizację. Gdy to ustawienie jest włączone, usługi lokalizacyjne z większym prawdopodobieństwem będą określać lokalizację na podstawie GPS.
  • PRIORITY_LOW_POWER – użyj tego ustawienia, aby żądać dokładnej lokalizacji na poziomie miasta (dokładność do około 10 kilometrów). Uważa się to za przybliżony poziom dokładności, który może zużywać mniej energii.
  • PRIORITY_NO_POWER – użyj tego ustawienia, jeśli potrzebujesz niewielkiego wpływu na zużycie energii, ale chcesz otrzymywać aktualizacje lokalizacji, gdy są dostępne. Gdy to ustawienie jest włączone, aplikacja nie aktualizuje lokalizacji, ale otrzymuje lokalizacje aktywowane przez inne aplikacje.

Utwórz żądanie lokalizacji i ustaw parametry zgodnie z tym przykładowym kodem:

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();
}

Priorytet obiektu PRIORITY_HIGH_ACCURACY w połączeniu z ustawieniem uprawnień ACCESS_FINE_LOCATION zdefiniowanym w manifeście aplikacji i krótkim okresie aktualizacji wynoszącym 5000 milisekund (5 sekund) powoduje, że dostawca uśrednionej lokalizacji zwraca aktualizacje lokalizacji z dokładnością z dokładnością do kilku metrów. Ta metoda jest odpowiednia w przypadku aplikacji mapujących, które wyświetlają lokalizację w czasie rzeczywistym.

Wskazówka dotycząca wydajności: jeśli po otrzymaniu aktualizacji lokalizacji aplikacja łączy się z siecią lub wykonuje inne długotrwałe działania, ustaw mniejszą wartość w najkrótszym czasie. 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ść.

Pobierz bieżące ustawienia lokalizacji

Po połączeniu się 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 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());

Gdy Task się zakończy, aplikacja może sprawdzić ustawienia lokalizacji, patrząc na 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.

Proszenie użytkownika o zmianę ustawień lokalizacji

Aby określić, czy ustawienia lokalizacji są odpowiednie w przypadku tego żądania, dodaj do obiektu Task obiekt OnFailureListener, który weryfikuje ustawienia lokalizacji. Następnie sprawdź, czy obiekt Exception przekazywany do metody onFailure() jest instancją klasy ResolvableApiException, co oznacza, że trzeba zmienić ustawienia. Następnie wyświetli się okno z prośbą o zgodę na zmianę ustawień lokalizacji przez wywołanie metody startResolutionForResult().

Ten fragment kodu pokazuje, jak sprawdzić, czy ustawienia lokalizacji użytkownika zezwalają usługom lokalizacyjnym na utworzenie LocationRequest, a także 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.
            }
        }
    }
});

Na następnej lekcji – Odbieranie aktualizacji lokalizacji, pokazujemy, jak otrzymywać okresowe powiadomienia o lokalizacji.