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