Zmienianie ustawień lokalizacji

Jeśli aplikacja musi poprosić o lokalizację lub otrzymać 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 i 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ń sprawdzać, które ustawienia są włączone, i wyświetlać okno ustawień lokalizacji, aby użytkownik mógł je zaktualizować 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 wykorzystujących lokalizację, muszą prosić o dostęp do lokalizacji w zależności od przypadków użycia tych funkcji.

Konfigurowanie prośby o lokalizację

Aby zapisać parametry żądań do dostawcy uśrednionej 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 ustawiamy interwał aktualizacji, najkrótszy interwał aktualizacji i priorytet, jak opisano poniżej:

Przerwa aktualizacji
setIntervalMillis() – ta metoda ustawia częstotliwość (w milisekundach), z jaką aplikacja ma otrzymywać informacje o zmianie lokalizacji. Pamiętaj, że informacje o zmianie lokalizacji mogą być nieco szybsze lub wolniejsze niż ta częstotliwość, aby zoptymalizować wykorzystanie baterii, lub mogą nie być w ogóle aktualizowane (np. jeśli urządzenie nie ma połączenia).
Najkrótszy 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 potrzebuje aktualizacji częściej niż określono w setInterval(), nie musisz wywoływać tej metody.
Priorytet

setPriority() – ta metoda ustawia priorytet żądania, co daje usługom lokalizacyjnym Usług Google Play wyraźną wskazówkę, których źródeł lokalizacji użyć. Dostępne wartości:

  • PRIORITY_BALANCED_POWER_ACCURACY – użyj tego ustawienia, aby poprosić o dokładność lokalizacji w obrębie kwartału ulic, czyli około 100 metrów. Jest to uważane za niski poziom dokładności i prawdopodobnie zużywa mniej energii. Przy tym ustawieniu usługi lokalizacyjne będą prawdopodobnie korzystać z pozycjonowania na podstawie 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 poprosić o jak najdokładniejszą lokalizację. Przy tym ustawieniu usługi wykorzystujące lokalizację będą częściej używać GPS-a 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 uważane za przybliżony poziom dokładności i prawdopodobnie zużywa mniej energii.
  • PRIORITY_PASSIVE – użyj tego ustawienia, jeśli chcesz, aby wpływ na zużycie energii był znikomy, ale chcesz otrzymywać informacje o zmianie lokalizacji, gdy są dostępne. Przy tym ustawieniu aplikacja nie wywołuje żadnych informacji o zmianie lokalizacji, ale otrzymuje lokalizacje wywołane przez inne aplikacje.

Utwórz żądanie lokalizacji i ustaw parametry, jak pokazano w tym przykładowym kodzie:

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 i krótkim interwałem aktualizacji wynoszącym 5000 milisekund (5 sekund) powoduje, że dostawca uśrednionej 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 informacji o zmianie lokalizacji aplikacja uzyskuje dostęp do sieci lub wykonuje inne długotrwałe zadania, ustaw wolniejszy najkrótszy interwał. Dzięki temu aplikacja nie będzie otrzymywać aktualizacji, których nie może użyć. Po zakończeniu długotrwałego zadania przywróć szybką wartość najkrótszego interwału.

Uzyskiwanie ustawień bieżącej lokalizacji

Po połączeniu się z usługami Google Play i interfejsem API usług lokalizacyjnych możesz uzyskać bieżące ustawienia lokalizacji na urządzeniu użytkownika. Aby to zrobić, utwórz LocationSettingsRequest.Builder i dodaj co najmniej 1 żądanie lokalizacji. 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 ustawienia bieżącej 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 działania Task aplikacja może sprawdzić ustawienia lokalizacji, odczytują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.

Poproś użytkownika o zmianę ustawień lokalizacji

Aby określić, czy ustawienia lokalizacji są odpowiednie dla żądania lokalizacji, dodaj OnFailureListener do obiektu Task, który sprawdza 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 zgodę użytkownika na zmianę ustawień lokalizacji, wywołując metodę startResolutionForResult().

Poniższy fragment kodu pokazuje, jak sprawdzić, czy ustawienia lokalizacji użytkownika zezwalają usługom lokalizacyjnym na utworzenie obiektu 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ępnej lekcji, Żądanie informacji o zmianie lokalizacji, dowiesz się, jak otrzymywać okresowe informacje o zmianie lokalizacji.