Die angemessene Verwendung von Standortinformationen kann für Nutzer Ihrer
App von Vorteil sein. Wenn Ihre App beispielsweise Nutzern hilft, sich zu Fuß oder
mit dem Auto zu orientieren, oder wenn sie den Standort von Assets verfolgt, muss sie in regelmäßigen Abständen den
Standort des Geräts abrufen. Neben dem geografischen
Standort (Breiten- und Längengrad) können Sie dem Nutzer weitere
Informationen wie die Richtung (horizontale Bewegungsrichtung), die Höhe oder
die Geschwindigkeit des Geräts zur Verfügung stellen. Diese und weitere Informationen sind im
Location
Objekt verfügbar, das Ihre App vom
Anbieter für kombinierte
Standortbestimmung abrufen kann. Die API aktualisiert Ihre App dann regelmäßig mit
dem bestmöglichen Standort, basierend auf den derzeit verfügbaren Standort
anbietern wie WLAN und GPS (Global Positioning System). Die Genauigkeit des
Standorts wird von den Anbietern, den
von Ihnen angeforderten Standortberechtigungen und den Optionen bestimmt, die Sie in der Standortanfrage festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie mit der
requestLocationUpdates()
Methode im Anbieter für kombinierte Standortbestimmung regelmäßige Updates zum Standort eines Geräts anfordern.
Letzten bekannten Standort abrufen
Der letzte bekannte Standort des Geräts bietet eine praktische Grundlage für den Anfang. So ist sichergestellt, dass die App einen bekannten Standort hat, bevor die
regelmäßigen Standortaktualisierungen beginnen. In der Lektion
Letzten bekannten Standort abrufen erfahren Sie
wie Sie den letzten bekannten Standort mit
getLastLocation() abrufen.
In den Snippets in den folgenden Abschnitten wird davon ausgegangen, dass Ihre App den letzten bekannten Standort bereits
abgerufen und als
Location Objekt in der globalen Variablen
mCurrentLocation gespeichert hat.
Standortanfrage stellen
Bevor Ihre App Standortaktualisierungen anfordern kann, muss sie eine Verbindung zu den Standort
diensten herstellen und eine Standortanfrage stellen. In der Lektion
Standorteinstellungen ändern
erfahren Sie, wie Sie das tun. Sobald eine Standortanfrage gestellt wurde, können Sie
die regelmäßigen Aktualisierungen mit
requestLocationUpdates() starten.
Je nach Form der Anfrage ruft der Anbieter für kombinierte Standortbestimmung entweder
die
LocationCallback.onLocationResult()
Callback-Methode auf und übergibt ihr eine Liste von Location Objekten oder
gibt ein
PendingIntent
aus, das den Standort in seinen erweiterten Daten enthält. Die Genauigkeit und Häufigkeit der
Aktualisierungen werden durch die von Ihnen angeforderten Standortberechtigungen und die
Optionen beeinflusst, die Sie im Standortanfrageobjekt festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie das Update mit dem
LocationCallback
Callback-Ansatz abrufen. Rufen Sie
requestLocationUpdates() auf,
übergeben Sie Ihre Instanz des
LocationRequest
Objekts
und ein LocationCallback.
Definieren Sie eine startLocationUpdates()-Methode wie im folgenden Codebeispiel:
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()); }
Beachten Sie, dass sich das obige Code-Snippet auf ein boolesches Flag bezieht,
requestingLocationUpdates, mit dem nachverfolgt wird, ob der Nutzer Standort
aktualisierungen aktiviert oder deaktiviert hat. Wenn Nutzer Standortaktualisierungen deaktiviert haben, können Sie sie informieren
über die Standortanforderungen Ihrer App. Weitere
Informationen zum Beibehalten des Werts des booleschen Flags über Instanzen der
Aktivität hinweg finden Sie unter Status der Aktivität speichern.
Callback für Standort-Updates definieren
Der Anbieter für kombinierte Standortbestimmung ruft die
LocationCallback.onLocationResult()
Callback-Methode auf. Das eingehende Argument enthält ein Listenobjekt Location mit dem Breiten- und Längengrad des Standorts. Das folgende Snippet
zeigt, wie Sie die
LocationCallback
Schnittstelle implementieren und die Methode definieren. Anschließend wird der Zeitstempel des Standort-Updates abgerufen
und der Breiten- und Längengrad sowie der Zeitstempel auf der Benutzeroberfläche Ihrer App
angezeigt:
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 // ... } } }; }
Standortaktualisierungen beenden
Überlegen Sie, ob Sie die Standortaktualisierungen beenden möchten, wenn die Aktivität nicht mehr im Vordergrund ist, z. B. wenn der Nutzer zu einer anderen App oder zu einer anderen Aktivität in derselben App wechselt. Das kann hilfreich sein, um den Stromverbrauch zu senken, sofern die App auch dann keine Informationen erheben muss, wenn sie im Hintergrund ausgeführt wird. In diesem Abschnitt erfahren Sie, wie Sie die
Aktualisierungen in der Aktivität
onPause() Methode beenden.
Rufen Sie
removeLocationUpdates() auf und übergeben Sie ein
LocationCallback,
wie im folgenden Codebeispiel gezeigt:
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); }
Verwenden Sie ein boolesches Flag, requestingLocationUpdates, um nachzuverfolgen
ob Standortaktualisierungen derzeit aktiviert sind. Prüfen Sie in der
onResume() Methode der Aktivität, ob Standortaktualisierungen derzeit aktiv sind, und aktivieren Sie sie gegebenenfalls:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
Status der Aktivität speichern
Eine Änderung der Gerätekonfiguration, z. B. der Bildschirm ausrichtung oder der Sprache, kann dazu führen, dass die aktuelle Aktivität zerstört wird. Ihre
App muss daher alle Informationen speichern, die zum Neuerstellen der Aktivität erforderlich sind.
Eine Möglichkeit dazu ist ein Instanzstatus, der in einem
Bundle Objekt gespeichert ist.
Das folgende Codebeispiel zeigt, wie Sie den Instanzstatus mit dem
onSaveInstanceState()
Callback der Aktivität speichern:
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); }
Definieren Sie eine updateValuesFromBundle() Methode, um die gespeicherten Werte aus der vorherigen Instanz der Aktivität wiederherzustellen, falls sie verfügbar sind. Rufen Sie die Methode in der Aktivität's
onCreate() Methode auf, wie im
folgenden Codebeispiel gezeigt:
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(); }
Weitere Informationen zum Speichern des Instanzstatus finden Sie in der Android Activity class reference.
Hinweis: Für einen nichtflüchtigeren Speicher können Sie
die Einstellungen des Nutzers in den
SharedPreferences Ihrer App speichern. Legen Sie die freigegebene Einstellung in
der onPause() Methode Ihrer Aktivität fest und
rufen Sie sie in onResume() ab.
Weitere Informationen zum Speichern von Einstellungen finden Sie unter
Schlüssel/Wert-Paare
speichern.
Zusätzliche Ressourcen
Weitere Informationen finden Sie in den folgenden Ressourcen:
Beispiele
- Beispiel-App, die zeigt, wie Standortaktualisierungen in Android empfangen werden.