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 prosić o regularne aktualizacje lokalizacji urządzenia za pomocą metody requestLocationUpdates() w połączonym dostawcy lokalizacji.

Pobieranie ostatniej znanej lokalizacji

Ostatnia znana lokalizacja urządzenia zapewnia przydatne informacje, upewnij się, że aplikacja ma znaną lokalizację. okresowe aktualizacje lokalizacji. W lekcji Pobieranie ostatniej znanej lokalizacji dowiesz się, jak pobrać ostatnią znaną lokalizację, wywołując getLastLocation(). Fragmenty kodu w następnych sekcjach zakładają, że Twoja aplikacja pobrała już ostatnią znaną lokalizację i zapisała ją jako obiekt Location w zmiennej globalnej mCurrentLocation.

Wysyłanie prośby o lokalizację

Zanim poprosisz o aktualizacje lokalizacji, aplikacja musi połączyć się z usługami lokalizacyjnymi i wysłać prośbę o lokalizację. Jak to zrobić, dowiesz się z lekcji Zmienianie ustawień lokalizacji. Po otrzymaniu prośby o lokalizację możesz rozpocząć regularnie, dzwoniąc pod numer requestLocationUpdates()

W zależności od formy żądania dostawca złączonej lokalizacji albo wywołuje metodę wywołania zwrotnego LocationCallback.onLocationResult() i przekazuje jej listę obiektów Location, albo wydaje żądanie PendingIntent, które zawiera lokalizację w rozszerzonych danych. Dokładność i częstotliwość aktualizacji zależą od żądanych przez Ciebie uprawnień dostępu do lokalizacji oraz opcji ustawionych 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(), jak w tym przykładzie kodu:

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. Więcej informacji o zachowywaniu wartości flagi logicznej w różnych wystąpieniach aktywności znajdziesz w artykule Zapisywanie stanu aktywności.

Definiowanie wywołania zwrotnego po aktualizacji lokalizacji

Dostawca uśrednionej lokalizacji wywołuje metodę wywołania zwrotnego LocationCallback.onLocationResult(). Argument przychodzący zawiera listę Location który zawiera szerokość i długość geograficzną lokalizacji. Poniższy fragment kodu pokazuje, jak zaimplementować interfejs LocationCallback i zdefiniować metodę, a potem pobrać sygnaturę czasową aktualizacji lokalizacji i wyświetlić szerokość geograficzną, długość geograficzną i sygnaturę czasową w interfejsie aplikacji:

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
                // ...
            }
        }
    };
}

Zatrzymanie aktualizacji lokalizacji

Zastanów się, czy chcesz zatrzymać aktualizacje lokalizacji, gdy dana aktywność przestanie być aktywna, np. gdy użytkownik przełączy się na inną aplikację lub inną aktywność w tej samej aplikacji. Może to być przydatne, aby zmniejszyć zużycie energii, pod warunkiem że aplikacja nie musi zbierać informacji nawet wtedy, gdy działa w tle. W tej sekcji dowiesz się, jak zatrzymać aktualizacje w metodzie onPause() aktywności.

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 metodzie onResume() działania sprawdź, czy aktualizacje lokalizacji są obecnie aktywne, a jeśli nie, to je aktywuj:

Kotlin

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

Java

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

Zapisywanie stanu aktywności

zmiana w konfiguracji urządzenia, na przykład zmiana ekranu; lub język, mogą spowodować zniszczenie bieżącej aktywności. Dlatego aplikacja musi przechowywać wszystkie 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 użyć wywołania zwrotnego onSaveInstanceState() aktywności do 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(), aby przywrócić zapisane wartości z poprzedniego wystąpienia aktywności, jeśli są dostępne. 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 udostępnione ustawienie w metodzie onPause() aktywności, a potem pobierz to ustawienie w metodzie onResume(). Więcej informacji o zapisywaniu ustawień znajdziesz w artykule Zapisywanie zestawów klucz-wartość.

Dodatkowe materiały

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

Próbki