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 użyć klienta ustawień, aby sprawdzić, które ustawienia są włączone, i jak wyświetlić użytkownikowi okno ustawień lokalizacji, aby mógł zaktualizować ustawienia jednym kliknięciem.

Konfigurowanie usług lokalizacyjnych

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 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 określają poziom dokładności żądań dotyczących 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 Twoja aplikacja nie korzysta z częstszych aktualizacji niż określone 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 poprosić o dokładność lokalizacji na poziomie kwartału, co odpowiada dokładności około 100 metrów. Jest to uważane za dokładność gruboziarnistą i prawdopodobnie wiąże się z mniejszym zużyciem energii. Przy tym ustawieniu usługi lokalizacyjne prawdopodobnie korzystają z sieci Wi-Fi i lokalizacji stacji bazowej. 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. Przy włączonym ustawieniu usługi lokalizacji częściej korzystają z GPS-a do określania lokalizacji.
  • PRIORITY_LOW_POWER - Użyj tego ustawienia, aby poprosić o dokładność na poziomie miasta, która wynosi około 10 km. 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. Ta zmiana uniemożliwia aplikacji otrzymywanie aktualizacji, których nie może użyć. Po zakończeniu długotrwałej operacji ustaw najszybszy 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 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 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ę obiektu LocationSettingsResponsegetLocationSettingsStates().

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