Poproś o aktualizacje lokalizacji

Właściwe korzystanie z informacji o lokalizacji może być korzystne dla użytkowników . Jeśli na przykład aplikacja pomaga użytkownikowi znaleźć drogę podczas chodzenia lub lub jeśli aplikacja śledzi lokalizację zasobów, musi uzyskać lokalizację urządzenia w regularnych odstępach czasu. Podobnie jak w przypadku regionu geograficznego lokalizacji (szerokość i długość geograficzną), możesz podać dodatkowe informacje informacje, takie jak kierunek (poziomy kierunek jazdy), wysokość lub wysokość z prędkością urządzenia. Te i inne informacje znajdziesz na Location obiekt, który aplikacja może pobrać z połączone dostawcy lokalizacji. W odpowiedzi interfejs API okresowo aktualizuje aplikację przy użyciu najlepszą dostępną lokalizację na podstawie aktualnie dostępnej lokalizacji; np. Wi-Fi i GPS (Global Positioning System). Dokładność lokalizacja jest określana przez dostawców, dostęp do lokalizacji, oraz opcje ustawione w prośbie o lokalizację.

Z tej lekcji dowiesz się, jak regularnie aktualizować informacje o lokalizacji za pomocą requestLocationUpdates() u dostawcy uśrednionej lokalizacji.

Pobierz ostatnią znaną lokalizację

Ostatnia znana lokalizacja urządzenia zapewnia przydatne informacje, upewnij się, że aplikacja ma znaną lokalizację. okresowe aktualizacje lokalizacji. Lekcja na Uzyskiwanie ostatniej znanej lokalizacji pokazuje: Jak sprawdzić ostatnią znaną lokalizację, dzwoniąc do getLastLocation(). Fragmenty kodu w sekcjach poniżej zakładają, że aplikacja została już pobrał(a) ostatnią znaną lokalizację i zapisał ją jako Location obiekt w zmiennej globalnej mCurrentLocation

Prześlij prośbę o lokalizację

Zanim poprosisz o aktualizację lokalizacji, aplikacja musi się z nią połączyć i poprosić o dostęp do lokalizacji. Lekcja na Zmiana ustawień lokalizacji jak to zrobić. Po otrzymaniu prośby o lokalizację możesz rozpocząć regularnie, dzwoniąc pod numer requestLocationUpdates()

W zależności od formy prośby dostawca uśrednionej lokalizacji może mieć albo wywołuje metodę LocationCallback.onLocationResult() wywołania zwrotnego i przekazuje do niej listę obiektów Location, wydaje PendingIntent , który zawiera lokalizację w rozszerzonych danych. Dokładność i częstotliwość na aktualizacje wpływają żądane uprawnienia lokalizacji ustawione w obiekcie żądania lokalizacji.

Z tej lekcji dowiesz się, jak zaktualizować te dane za pomocą LocationCallback metodę wywołania zwrotnego. Zadzwoń do nas requestLocationUpdates() i przekazujesz ją do instancji LocationRequest obiektu, i LocationCallback. Zdefiniuj metodę startLocationUpdates() zgodnie z tym przykładowym kodem:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

Zwróć uwagę, że powyższy fragment kodu odnosi się do flagi wartości logicznej, requestingLocationUpdates: służy do śledzenia, czy użytkownik zmienił lokalizację. włącz lub wyłącz aktualizacje. Jeśli użytkownicy wyłączyli aktualizacje lokalizacji, możesz powiadomić nas o tym z wymaganiami aplikacji dotyczącymi lokalizacji. Dla: o zachowywaniu wartości flagi wartości logicznej w instancjach zobacz Zapisywanie stanu aktywności.

Zdefiniuj wywołanie zwrotne aktualizacji lokalizacji

Dostawca uśrednionej lokalizacji wywołuje metodę LocationCallback.onLocationResult() metody wywołania zwrotnego. Argument przychodzący zawiera listę Location który zawiera szerokość i długość geograficzną lokalizacji. Ten fragment kodu pokazuje, jak zaimplementować LocationCallback i zdefiniuj metodę, a następnie pobierz sygnaturę czasową aktualizacji lokalizacji i wyświetlać szerokość, długość i sygnaturę czasową interfejs:

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

Wyłączanie aktualizacji lokalizacji

Zastanów się, czy chcesz zatrzymać aktualizacje lokalizacji, gdy aktywność nie są już widoczne, na przykład gdy użytkownik przełącza się na inną aplikację lub inną aktywność w tej samej aplikacji. Może to być przydatne, by zmniejszyć zużycie energii. pod warunkiem, że aplikacja nie musi zbierać informacji, nawet jeśli który działa w tle. W tej sekcji znajdziesz informacje na temat tego, jak zatrzymać w polu aktywności Metoda onPause().

Aby wyłączyć aktualizacje lokalizacji, zadzwoń removeLocationUpdates() z wynikiem pozytywnym LocationCallback, jak w tym przykładowym kodzie:

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

Do śledzenia użyj wartości logicznej requestingLocationUpdates czy aktualizacje lokalizacji są obecnie włączone. W sekcji aktywności Metoda onResume(), sprawdź czy aktualizacje lokalizacji są obecnie aktywne, a jeśli nie, aktywuj je:

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

Zapisz stan aktywności

zmiana w konfiguracji urządzenia, na przykład zmiana ekranu; lub język, mogą spowodować zniszczenie bieżącej aktywności. Twoje Aplikacja musi więc przechowywać wszelkie informacje potrzebne do odtworzenia aktywności. Można to zrobić na przykład przez stan instancji zapisany w Bundle obiekt.

Poniższy przykładowy kod pokazuje, jak korzystać z tagu aktywności onSaveInstanceState() wywołanie zwrotne w celu zapisania stanu instancji:

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

Zdefiniuj metodę updateValuesFromBundle() do przywrócenia zapisane wartości z poprzedniego wystąpienia aktywności, jeśli są i dostępności informacji. Wywołaj metodę z tagu aktywności onCreate(), jak widać w metodzie następujący przykładowy kod:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

Więcej informacji o zapisywaniu stanu instancji znajdziesz w Androida informacje o zajęciach.

Uwaga: aby zapewnić trwałą pamięć masową, możesz zapisać preferencje użytkownika w sekcji SharedPreferences Ustaw wspólne preferencje w metodę onPause() związaną z aktywnością, pobierz preferencje w onResume(). Więcej informacji o zapisywaniu ustawień znajdziesz na stronie Zapisywanie Zestawy par klucz-wartość.

Dodatkowe materiały

Aby dowiedzieć się więcej, skorzystaj z tych materiałów:

Próbki