Die ordnungsgemäße Verwendung von Standortinformationen kann für Nutzer Ihrer App von Vorteil sein. Wenn Ihre App Nutzern beispielsweise beim Gehen oder Autofahren den Weg weist oder den Standort von Assets erfasst, muss sie in regelmäßigen Abständen den Standort des Geräts abrufen. Neben der geografischen
Standort (Breiten- und Längengrad) angeben, können Sie dem Nutzer
z. B. Peilung (horizontale Fahrtrichtung), Höhe oder
Geschwindigkeit des Geräts. Diese und weitere Informationen sind im Location
-Objekt verfügbar, das Ihre 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 der
wird der Standort von den Anbietern bestimmt,
von Ihnen erteilte Berechtigungen zur Standortermittlung
angefordert und den Optionen, die Sie in der Standortanfrage festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie regelmäßige Updates
Standort mithilfe der
requestLocationUpdates()
im Anbieter für kombinierte Standortbestimmung.
Letzten bekannten Standort abrufen
Der zuletzt bekannte Standort des Geräts bietet einen praktischen Ausgangspunkt, damit die App einen bekannten Standort hat, bevor die regelmäßigen Standortupdates gestartet werden. Die Lektion zur
Unter Letzten bekannten Standort abrufen sehen Sie,
wie finde ich den letzten bekannten Standort?
getLastLocation()
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.
Standortabfrage stellen
Bevor Standortaktualisierungen angefordert werden können, muss Ihre App eine Verbindung zu Standortdiensten herstellen und eine Standortanfrage stellen. Die Lektion zur
Standorteinstellungen ändern
wie das geht. Sobald eine Standortanfrage vorliegt, können Sie die regelmäßigen Aktualisierungen starten, indem Sie requestLocationUpdates()
anrufen.
Je nach Form der Anfrage ruft der Anbieter für den zusammengeführten Standort 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 von
Die Updates werden von den angeforderten Berechtigungen zur Standortermittlung und dem
Optionen, die Sie im Objekt zur Standortanfrage festgelegt haben.
In dieser Lektion erfahren Sie, wie Sie das Update mithilfe der
LocationCallback
Callback-Ansatz ausprobieren. Anruf
requestLocationUpdates()
,
Ihre Instanz des
LocationRequest
Objekt,
und 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()); }
Das obige Code-Snippet bezieht sich auf ein boolesches Flag, requestingLocationUpdates
, mit dem erfasst wird, ob der Nutzer die Standortermittlung aktiviert oder deaktiviert hat. Wenn Nutzer die Standortermittlung deaktiviert haben, können Sie sie über die Standortanforderungen Ihrer App informieren. Weitere Informationen zum Beibehalten des Werts des booleschen Flags für alle Instanzen der Aktivität finden Sie unter Status der Aktivität speichern.
Callback für Standortaktualisierungen definieren
Der Anbieter für kombinierte Standortbestimmung ruft den Parameter
LocationCallback.onLocationResult()
. Das eingehende Argument enthält die Liste Location
.
-Objekt, das den Breiten- und Längengrad des Standorts enthält. Im folgenden Snippet wird gezeigt, wie Sie die Benutzeroberfläche LocationCallback
implementieren und die Methode definieren, dann den Zeitstempel der Standortaktualisierung abrufen und die geografische Breite, Länge und 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 // ... } } }; }
Standortaktualisierungen beenden
Überlegen Sie, ob Sie die Standortaktualisierungen stoppen möchten, wenn die Aktivität
nicht mehr im Fokus sind, z. B. wenn der Nutzer zu einer anderen App oder
verschiedenen Aktivitäten in derselben App. Dies kann praktisch sein, um
vorausgesetzt, die App muss keine Informationen erheben, auch wenn
im Hintergrund ausgeführt wird. In diesem Abschnitt erfahren Sie, wie Sie
in der Aktivität
onPause()
-Methode.
Wenn du keine Standortupdates mehr erhalten möchtest, rufe
removeLocationUpdates()
,
ihm eine
LocationCallback
,
Dies wird 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); }
Mit einem booleschen Wert, requestingLocationUpdates
, kannst du nachverfolgen, 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 an der Gerätekonfiguration, z. B. eine Änderung der Bildschirmausrichtung oder Sprache, kann dazu führen, dass die aktuelle Aktivität gelöscht wird. Ihr
App muss daher alle Informationen speichern, die sie benötigt, um die Aktivität zu reproduzieren.
Eine Möglichkeit hierfür ist ein Instanzstatus, der in einem Bundle
-Objekt gespeichert ist.
Das folgende Codebeispiel zeigt, wie Sie die Methode
onSaveInstanceState()
Callback auf, 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); }
Definieren Sie eine updateValuesFromBundle()
-Methode, um die gespeicherten Werte aus der vorherigen Instanz der Aktivität wiederherzustellen, sofern verfügbar. 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 Android Activity-Klasse.
Hinweis: Für einen länger anhaltenden Speicher können Sie die Einstellungen des Nutzers in der SharedPreferences
Ihrer App speichern. Legen Sie die Freigabeeinstellung fest in
Die onPause()
-Methode Ihrer Aktivität und
ruft die Einstellung in onResume()
ab.
Weitere Informationen zum Speichern von Einstellungen finden Sie unter
Wird gespeichert...
Schlüssel/Wert-Paare.
Weitere Informationen
Weitere Informationen finden Sie in den folgenden Ressourcen:
Produktproben
- Beispielanwendung, die den Empfang von Standortaktualisierungen unter Android demonstriert.