Zmienianie ustawień lokalizacji

Jeśli aplikacja musi prosić o dostęp do lokalizacji lub zaktualizować uprawnienia, Urządzenie musi włączyć odpowiednie ustawienia systemu, takie jak GPS lub Wi-Fi. skanowanie. Zamiast bezpośrednio włączać usługi, takie jak GPS urządzenia, aplikacja określa wymagany poziom dokładności/zużycie energii oraz odpowiedni interwał aktualizacji, a urządzenie automatycznie zmian w ustawieniach systemu. Te ustawienia są definiowane przez LocationRequest obiektu danych.

Z tej lekcji dowiesz się, jak korzystać z funkcji Klient ustawień aby sprawdzić, które ustawienia są włączone, i wyświetlić Ustawienia lokalizacji użytkownik może zaktualizować ustawienia jednym kliknięciem.

Skonfiguruj usługi lokalizacyjne

w celu korzystania z usług lokalizacyjnych dostępnych w ramach Usług Google Play oraz u dostawcy uśrednionej lokalizacji połącz aplikację za pomocą Klient ustawień, sprawdź bieżące ustawienia lokalizacji i poproś użytkownika o włączenie wymagane ustawienia.

Aplikacje, które korzystają z usług lokalizacyjnych, muszą poprosić o dostęp do lokalizacji, w zależności od przypadku użycia tych funkcji.

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. Dla: szczegóły wszystkich dostępnych opcji próśb o lokalizację, zobacz LocationRequest odniesienie do klasy. Ta lekcja ustawia interwał aktualizacji, czyli najszybszą aktualizację. i priorytetu, jak opisano poniżej:

Przerwa aktualizacji
setInterval(). - Ta metoda ustawia w milisekundach preferowany czas wykonywania otrzymywać aktualizacje lokalizacji. Pamiętaj, że aktualizacje lokalizacji mogą być lub wolniej, by zoptymalizować wykorzystanie baterii. w ogóle nie będzie się aktualizować (jeśli na przykład urządzenie nie ma połączenia z siecią).
Najszybszy interwał aktualizacji
setFastestInterval(). – Ta metoda ustawia najszybszą szybkość w milisekundach: które aplikacja może obsługiwać aktualizacje lokalizacji. O ile Twoja aplikacja nie czerpie korzyści z otrzymujesz aktualizacje szybciej niż wynosi częstotliwość określona w setInterval(), nie musisz wywoływać tej metody.
Priorytet

setPriority() - Ta metoda określa priorytet żądania, dzięki czemu Google Play usługi lokalizacyjne Google daje wskazówkę dotyczącą tego, z których źródeł chcesz korzystać. Obsługiwane są te wartości:

  • PRIORITY_BALANCED_POWER_ACCURACY - Użyj tego ustawienia, aby żądać dokładnej lokalizacji w obrębie miasta. bloków o szerokości około 100 metrów. To jest uważany za przybliżony poziom dokładności i może zużywać mniej . Gdy to ustawienie jest włączone, usługi lokalizacyjne zwykle używają Wi-Fi i określania położenia stacji bazowych. Pamiętaj jednak, że wybór lokalizacji zależy od wielu innych czynników, takich jak to, które źródła i dostępności informacji.
  • PRIORITY_HIGH_ACCURACY – To ustawienie służy do wyświetlania prośby o najdokładniejszą możliwą lokalizację. Na to ustawienie spowoduje, że usługi lokalizacyjne będą częściej korzystać z GPS-u. aby określić lokalizację.
  • PRIORITY_LOW_POWER - To ustawienie służy do określania precyzji na poziomie miasta, która jest z dokładnością do około 10 kilometrów. Uznaje się to za przybliżony poziom dokładności, co prawdopodobnie zużywa mniej energii.
  • PRIORITY_NO_POWER – Używaj tego ustawienia, jeśli potrzebujesz niewielkiego wpływu na zużycie energii. , ale chcesz też otrzymywać aktualne informacje o lokalizacji. W związku z tym aplikacja nie aktualizuje żadnych lokalizacji, ale odbiera lokalizacje aktywowane przez inne aplikacje.

Utwórz żądanie lokalizacji i ustaw parametry jak w tym przykładzie przykładowy kod:

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 PRIORITY_HIGH_ACCURACY w połączeniu z ACCESS_FINE_LOCATION określonych w manifeście aplikacji oraz szybkie aktualizacje odstęp 5000 milisekund (5 sekund), sprawia, że uśredniona lokalizacja na bieżąco przesyłać aktualne informacje o lokalizacji z dokładnością do kilku metrów. Ta metoda jest odpowiednia w przypadku aplikacji mapowych, które wyświetlają lokalizację w czasie rzeczywistym.

Wskazówka dotycząca wydajności: jeśli aplikacja uzyskuje dostęp do lub inne długotrwałe działania po otrzymaniu aktualizacji lokalizacji. do ustawienia wolniejszej wartości. Ta zmiana uniemożliwia 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

Gdy połączysz się z Usługami Google Play i usługami lokalizacyjnymi API, możesz pobrać bieżące ustawienia lokalizacji urządzenia użytkownika. Do zrobienia to, utwórz LocationSettingsRequest.Builder i dodać co najmniej jedną prośbę o lokalizację. Fragment kodu poniżej pokazuje, , aby dodać prośbę o lokalizację utworzoną 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 aplikacja może sprawdzić ustawienia lokalizacji na podstawie stanu kod z LocationSettingsResponse obiektu. Aby uzyskać jeszcze więcej informacji o obecnym stanie kategorii ustawieniach lokalizacji, aplikacja może wywoływać metodę LocationSettingsResponse obiektu getLocationSettingsStates() .

Proszenie użytkownika o zmianę ustawień lokalizacji

Określenie, czy ustawienia lokalizacji są odpowiednie dla danej lokalizacji dodaj OnFailureListener do Task, który weryfikuje ustawienia lokalizacji. Następnie sprawdź, jeśli Exception obiekt przekazano do Metoda onFailure() jest instancją ResolvableApiException, która wskazuje, że ustawienia musi zostać zmieniony. Następnie wyświetl okno z prośbą o udzielenie użytkownikowi uprawnień do zmienić ustawienia lokalizacji, dzwoniąc pod numer startResolutionForResult()

Fragment kodu poniżej pokazuje, jak określić, czy lokalizacja użytkownika ustawienia pozwalają usługom lokalizacyjnym na tworzenie LocationRequest, a także o tym, jak poprosić użytkownika o podanie tych informacji uprawnienia do zmiany 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.
            }
        }
    }
});

Kolejna lekcja, Odbieranie aktualizacji lokalizacji, programy sposób otrzymywania okresowych aktualizacji lokalizacji.