Odpowiednie wykorzystanie informacji o lokalizacji może być korzystne dla użytkowników Twojej
aplikacji. Jeśli na przykład aplikacja pomaga użytkownikowi w nawigacji podczas chodzenia lub
jazdy albo śledzi lokalizację zasobów, musi regularnie pobierać
lokalizację urządzenia. Oprócz położenia geograficznego (szerokości i długości geograficznej) możesz podać użytkownikowi dodatkowe informacje, takie jak kierunek (poziomy kierunek podróży), wysokość lub prędkość urządzenia. Te i inne informacje są dostępne w obiekcie, który aplikacja może pobrać od dostawcy uśrednionej
lokalizacji.Location W odpowiedzi interfejs API okresowo aktualizuje aplikację, podając
najlepszą dostępną lokalizację na podstawie aktualnie dostępnych dostawców lokalizacji, takich jak Wi-Fi i GPS (Global Positioning System). Dokładność lokalizacji zależy od dostawców, uprawnień do lokalizacji, o które prosisz, oraz opcji ustawionych w żądaniu lokalizacji.
Z tego samouczka dowiesz się, jak prosić o regularne aktualizacje lokalizacji urządzenia za pomocą metody requestLocationUpdates()
w dostawcy uśrednionej lokalizacji.
Pobieranie ostatniej znanej lokalizacji
Ostatnia znana lokalizacja urządzenia to wygodna podstawa, od której można zacząć, dzięki czemu aplikacja ma znaną lokalizację przed rozpoczęciem okresowych aktualizacji lokalizacji. Z samouczka
Pobieranie ostatniej znanej lokalizacji dowiesz się
jak pobrać ostatnią znaną lokalizację, wywołując
getLastLocation().
Fragmenty kodu w kolejnych sekcjach zakładają, że 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ę. Z samouczka
Zmienianie ustawień lokalizacji
dowiesz się, jak to zrobić. Gdy prośba o lokalizację zostanie wysłana, możesz rozpocząć
regularne aktualizacje, wywołując
requestLocationUpdates().
W zależności od formy żądania dostawca uśrednionej lokalizacji albo
wywołuje
LocationCallback.onLocationResult()
metodę wywołania zwrotnego i przekazuje jej listę obiektów Location albo
wysyła
PendingIntent
, który zawiera lokalizację w rozszerzonych danych. Dokładność i częstotliwość
aktualizacji zależą od uprawnień do lokalizacji, o które prosisz, oraz
opcji ustawionych w obiekcie żądania lokalizacji.
Z tego samouczka dowiesz się, jak uzyskać aktualizację za pomocą metody wywołania zwrotnego
LocationCallback. Wywołaj metodę
requestLocationUpdates(),
przekazując jej instancję obiektu
LocationRequest
i LocationCallback.
Zdefiniuj metodę startLocationUpdates() zgodnie z tym przykładem 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 odwołuje się do flagi logicznej,
requestingLocationUpdates, która służy do śledzenia, czy użytkownik włączył lub wyłączył aktualizacje
lokalizacji. Jeśli użytkownicy wyłączyli aktualizacje lokalizacji, możesz poinformować
ich o wymaganiach aplikacji dotyczących lokalizacji. Więcej
informacji o zachowywaniu wartości flagi logicznej w różnych instancjach
aktywności znajdziesz w artykule Zapisywanie stanu aktywności.
Definiowanie wywołania zwrotnego informacji o zmianie lokalizacji
Dostawca uśrednionej lokalizacji wywołuje metodę wywołania zwrotnego
LocationCallback.onLocationResult(). Argument przychodzący zawiera listę Location obiektów zawierających szerokość i długość geograficzną lokalizacji. Poniższy fragment kodu
pokazuje, jak zaimplementować
LocationCallback
interfejs i zdefiniować metodę, a następnie pobrać sygnaturę czasową informacji o zmianie lokalizacji
i wyświetlić szerokość, długość geograficzną oraz sygnaturę czasową w interfejsie użytkownika 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 // ... } } }; }
Zatrzymywanie aktualizacji lokalizacji
Zastanów się, czy chcesz zatrzymać aktualizacje lokalizacji, gdy aktywność jest
nie jest już aktywna, np. gdy użytkownik przełączy się na inną aplikację lub inną
aktywność w tej samej aplikacji. Może to być przydatne do zmniejszenia zużycia
energii, pod warunkiem że aplikacja nie musi zbierać informacji, nawet gdy
działa w tle. W tej sekcji dowiesz się, jak zatrzymać
aktualizacje w metodzie
onPause() aktywności.
Aby zatrzymać aktualizacje lokalizacji, wywołaj
removeLocationUpdates(),
przekazując jej
LocationCallback,
jak pokazano w tym przykładzie kodu:
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); }
Użyj wartości logicznej requestingLocationUpdates, aby śledzić
czy aktualizacje lokalizacji są obecnie włączone. W metodzie
onResume() aktywności sprawdź
czy aktualizacje lokalizacji są obecnie aktywne, i aktywuj je, jeśli nie są:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
Zapisywanie stanu aktywności
Zmiana konfiguracji urządzenia, np. orientacji ekranu lub języka, może spowodować zniszczenie bieżącej aktywności. Dlatego
aplikacja musi przechowywać wszystkie informacje potrzebne do ponownego utworzenia aktywności.
Jednym ze sposobów na to jest stan instancji przechowywany w
Bundle obiekcie.
Ten przykład kodu pokazuje, jak użyć wywołania zwrotnego aktywności
onSaveInstanceState()
, aby zapisać stan 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 poprzedniej instancji aktywności, jeśli są
dostępne. Wywołaj metodę z metody aktywności
onCreate(), jak pokazano w
tym przykładzie kodu:
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 dokumentacji klasy Android Activity.
Uwaga: aby uzyskać trwalszą pamięć trwałą, możesz
przechowywać preferencje użytkownika w
SharedPreferences. Ustaw preferencje udostępnione w
metodzie onPause() aktywności i
pobierz je w onResume().
Więcej informacji o zapisywaniu preferencji znajdziesz w artykule
Zapisywanie
zbiorów par klucz-wartość.
Dodatkowe materiały
Więcej informacji znajdziesz w tych materiałach:
Przykłady
- Przykładowa aplikacja, która pokazuje, jak otrzymywać aktualizacje lokalizacji w Androidzie.