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
- Przykładowa aplikacja demonstrująca otrzymywanie aktualizacji lokalizacji na urządzeniu z Androidem.