Zmienianie ustawień lokalizacji

Jeśli aplikacja musi prosić o dostęp do lokalizacji lub otrzymywać aktualizacje uprawnień, urządzenie musi mieć włączone odpowiednie ustawienia systemu, takie jak skanowanie GPS lub Wi-Fi. Zamiast włączać bezpośrednio usługi, takie jak GPS na urządzeniu, aplikacja określa wymagany poziom dokładności/ilości zużycia energii i wymagany odstęp czasu między aktualizacjami, 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 wyświetlić okno Ustawienia lokalizacji, aby użytkownik mógł zaktualizować ustawienia jednym kliknięciem.

Konfigurowanie usług lokalizacyjnych

Aby korzystać z usług lokalizacyjnych świadczonych przez Usługi Google Play i dostawcę uśrednionej lokalizacji, połącz aplikację za pomocą klienta ustawień, a potem 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ą poprosić 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ń 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 żądań lokalizacji znajdziesz w dokumentacji klasy LocationRequest. W ramach tej lekcji ustawiasz interwał aktualizacji, najszybszy czas aktualizacji i priorytet, jak opisano poniżej:

Interwał aktualizacji
setInterval() – ta metoda określa (w milisekundach) częstotliwość, z jaką aplikacja preferuje otrzymywanie aktualizacji o lokalizacji. Pamiętaj, że aktualizacje lokalizacji mogą być trochę szybsze lub wolniejsze niż to ustawienie, żeby zoptymalizować wykorzystanie baterii, lub w ogóle się nie pojawiają (np. jeśli urządzenie nie ma połączenia).
Najszybszy interwał aktualizacji
setFastestInterval() – ta metoda ustawia najszybszą szybkość (w milisekundach), z jaką aplikacja może obsłużyć aktualizacje lokalizacji. Nie musisz wywoływać tej metody, chyba że Twoja aplikacja korzysta z aktualizacji szybciej niż wynosi stawka określona we właściwości setInterval().
Priorytet

setPriority() – ta metoda określa priorytet żądania, co daje usługom lokalizacyjnym Usług Google Play wyraźną wskazówkę o tym, których źródeł lokalizacji użyć. Obsługiwane są te wartości:

  • PRIORITY_BALANCED_POWER_ACCURACY – to ustawienie pozwala prosić o dokładność lokalizacji w dzielnicy miasta (z dokładnością do około 100 metrów). Uznaje się to za przybliżony poziom dokładności i może zużywać mniej energii. Przy tym ustawieniu usługi lokalizacyjne prawdopodobnie będą używać Wi-Fi i określania pozycji na stacji bazowej sieci 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 – to ustawienie pozwala prosić o dokładną lokalizację. W przypadku tego ustawienia usługi lokalizacyjne mogą z większym prawdopodobieństwem określić lokalizację za pomocą GPS.
  • PRIORITY_LOW_POWER – użyj tego ustawienia, by poprosić o dokładność na poziomie miasta (z dokładnością do około 10 kilometrów). Uznaje się to za przybliżony poziom dokładności i może zużywać mniej 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 uruchamia żadnych aktualizacji lokalizacji, ale otrzymuje lokalizacje aktywowane przez inne aplikacje.

Utwórz żądanie dotyczące 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 uprawnienia ACCESS_FINE_LOCATION określonym w manifeście aplikacji oraz krótkim czasem aktualizacji wynoszącym 5000 milisekund (5 sekund) powoduje, że dostawca uśrednionej lokalizacji zwraca aktualizacje z dokładnością do kilku metrów. To 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 aktualizacji lokalizacji Twoja aplikacja łączy się z siecią lub wykonuje inne długotrwałe działania, zmień krótszy odstęp czasu, tak aby jego wartość była wolniejsza. Ta korekta uniemożliwia aplikacji instalowanie aktualizacji, której nie może użyć. Po zakończeniu długotrwałej pracy ustaw najszybszy interwał z powrotem na szybką wartość.

Pobierz bieżące ustawienia 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 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 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 Task 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 sprawdzić, czy ustawienia lokalizacji są odpowiednie dla żądania lokalizacji, dodaj OnFailureListener do obiektu Task, który weryfikuje ustawienia lokalizacji. Następnie sprawdź, czy obiekt Exception przekazany do metody onFailure() jest instancją klasy ResolvableApiException, co oznacza, że ustawienia należy zmienić. Następnie wyświetl okno z prośbą o pozwolenie na zmianę ustawień lokalizacji, wywołując startResolutionForResult().

Z tego fragmentu kodu dowiesz się, jak ustalić, czy ustawienia lokalizacji użytkownika zezwalają usługom lokalizacji 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.
            }
        }
    }
});

Z kolejnej lekcji dowiesz się, jak otrzymywać okresowe aktualizacje lokalizacji.