Die angemessene Verwendung von Standortinformationen kann für die Nutzer deiner App von Vorteil sein. Wenn deine App dem Nutzer beispielsweise hilft, sich beim Gehen oder Fahren zurechtzufinden, 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 Peilung (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 deine App vom Anbieter für kombinierte Standortbestimmung abrufen kann. Daraufhin aktualisiert die API Ihre App regelmäßig mit dem besten verfügbaren Standort, basierend auf den derzeit verfügbaren Standortanbietern wie WLAN und GPS (Global Positioning System). Die Genauigkeit des Standorts wird durch die Anbieter, die von Ihnen angeforderten Berechtigungen zur Standortermittlung und die Optionen bestimmt, die Sie in der Standortanfrage festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie mit der Methode requestLocationUpdates() im Anbieter für kombinierte Standortbestimmung regelmäßige Updates zum Standort eines Geräts anfordern.
Letzten bekannten Standort abrufen
Der zuletzt bekannte Standort des Geräts ist ein guter Ausgangspunkt, um sicherzustellen, dass die App einen bekannten Standort hat, bevor die regelmäßigen Standort-Updates gestartet werden. In der Lektion Letzten bekannten Standort abrufen wird gezeigt, wie Sie den letzten bekannten Standort durch Aufrufen von 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 Variable mCurrentLocation gespeichert hat.
Standortabfrage senden
Bevor deine App Standort-Updates anfordern kann, muss sie eine Verbindung zu den Standortdiensten herstellen und eine Standortanfrage senden. In der Lektion Standorteinstellungen ändern wird gezeigt, wie das geht. Sobald eine Standortanfrage vorhanden ist, können Sie die regelmäßigen Aktualisierungen starten, indem Sie requestLocationUpdates() aufrufen.
Je nach Form der Anfrage ruft der Anbieter für kombinierte Standortbestimmung entweder die Callback-Methode LocationCallback.onLocationResult() auf und übergibt ihr eine Liste von Location-Objekten oder gibt einen PendingIntent aus, der den Standort in seinen erweiterten Daten enthält. Die Genauigkeit und Häufigkeit der Aktualisierungen hängen von den angeforderten Berechtigungen zur Standortermittlung und den Optionen ab, die Sie im Objekt für die Standortanfrage festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie das Update mithilfe des Callback-Ansatzes LocationCallback abrufen. Rufen Sie requestLocationUpdates() auf und übergeben Sie die Instanz des LocationRequest-Objekts und ein LocationCallback.
Definieren Sie eine startLocationUpdates()-Methode, wie im folgenden Codebeispiel gezeigt:
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()); }
Im obigen Code-Snippet wird auf ein boolesches Flag requestingLocationUpdates verwiesen, mit dem erfasst wird, ob der Nutzer Standort-Updates aktiviert oder deaktiviert hat. Wenn Nutzer Standort-Updates deaktiviert haben, kannst du sie über die Standortanforderungen deiner App informieren. 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 Standortaktualisierung definieren
Der Anbieter für kombinierte Standortbestimmung ruft die Callback-Methode LocationCallback.onLocationResult() auf. Das eingehende Argument enthält ein Listenobjekt Location mit dem Breiten- und Längengrad des Standorts. Das folgende Snippet zeigt, wie Sie die Schnittstelle LocationCallback implementieren und die Methode definieren, dann den Zeitstempel des Standort-Updates abrufen und den Breiten- und Längengrad sowie den Zeitstempel auf der Benutzeroberfläche Ihrer App anzeigen:
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 // ... } } }; }
Standort-Updates beenden
Überlegen Sie, ob Sie die Standort-Updates beenden möchten, wenn die Aktivität nicht mehr im Fokus ist, z. B. wenn der Nutzer zu einer anderen App oder zu einer anderen Aktivität in derselben App wechselt. Dies kann nützlich sein, um den Stromverbrauch zu senken, sofern die App keine Informationen erfassen muss, wenn sie im Hintergrund ausgeführt wird. In diesem Abschnitt wird gezeigt, wie Sie die Aktualisierungen in der Methode onPause() der Aktivität beenden können.
Wenn Sie Standort-Updates beenden möchten, rufen Sie removeLocationUpdates() auf und übergeben Sie 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 den booleschen Wert requestingLocationUpdates, um zu verfolgen, ob Standortaktualisierungen derzeit aktiviert sind. Prüfen Sie in der onResume()-Methode der Aktivität, ob Standort-Updates derzeit aktiv sind, und aktivieren Sie sie, falls nicht:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
Aktivitätsstatus speichern
Eine Änderung der Gerätekonfiguration, z. B. eine Änderung der Bildschirmausrichtung oder der Sprache, kann dazu führen, dass die aktuelle Aktivität gelöscht wird. Ihre App muss daher alle Informationen speichern, die sie zum Neuerstellen der Aktivität benötigt.
Eine Möglichkeit hierfür ist ein Instanzstatus, der in einem Bundle-Objekt gespeichert ist.
Im folgenden Codebeispiel wird gezeigt, wie der Callback onSaveInstanceState() der Aktivität verwendet wird, um den Instanzstatus zu 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); }
Definiere eine updateValuesFromBundle()-Methode, um die gespeicherten Werte aus der vorherigen Instanz der Aktivität wiederherzustellen, falls sie verfügbar sind. Rufen Sie die Methode über die onCreate()-Methode der Aktivität 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 Referenz zur Android-Klasse „Activity“.
Hinweis:Wenn Sie die Einstellungen des Nutzers dauerhafter speichern möchten, können Sie sie in den SharedPreferences nichtflüchtigen Speicher Ihrer App speichern. Legen Sie die freigegebene Einstellung in der Methode onPause() Ihrer Aktivität fest und rufen Sie die Einstellung 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 Standort-Updates in Android empfangen werden.