Standortaktualisierungen anfordern

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 Ihre App den Standort von Assets verfolgt, muss sie den Standort des Geräts in regelmäßigen Abständen abrufen. Neben dem geografischen Standort (Breiten- und Längengrad) können Sie dem Nutzer auch weitere Informationen wie die Peilung (horizontale Fahrtrichtung), die Höhe oder die Geschwindigkeit des Geräts anzeigen. 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 aktuell verfügbaren Standortanbietern wie WLAN und GPS (Global Positioning System). Die Genauigkeit des Standorts wird durch die Anbieter, die von Ihnen angeforderten Standortberechtigungen und die Optionen bestimmt, die Sie in der Standortanfrage festlegen.

In dieser Lektion erfahren Sie, wie Sie mit der Methode requestLocationUpdates() im Fused Location Provider regelmäßige Updates zum Standort eines Geräts anfordern.

Letzten bekannten Standort abrufen

Der letzte bekannte Standort des Geräts ist eine praktische Grundlage, um mit der Suche zu beginnen. So hat die App einen bekannten Standort, bevor die regelmäßigen Standortaktualisierungen gestartet werden. Im Kurs Letzten bekannten Standort abrufen erfahren Sie, wie Sie den letzten bekannten Standort durch Aufrufen von getLastLocation() abrufen. In den Code-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 senden

Bevor Ihre App Standortaktualisierungen anfordern kann, muss sie eine Verbindung zu den Standortdiensten herstellen und eine Standortanfrage senden. In der Lektion Standorteinstellungen ändern erfahren Sie, wie Sie das tun. Sobald eine Standortanfrage vorliegt, können Sie die regelmäßigen Aktualisierungen durch Aufrufen von requestLocationUpdates() starten.

Je nach Art der Anfrage ruft der Fused Location Provider 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 von Ihnen angeforderten Standortberechtigungen und den Optionen ab, die Sie im Standortanfrageobjekt festlegen.

In dieser Lektion erfahren Sie, wie Sie das Update mit dem LocationCallback-Callback-Ansatz abrufen. Rufen Sie requestLocationUpdates() auf und übergeben Sie Ihre 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 nachverfolgt wird, ob der Nutzer Standortaktualisierungen aktiviert oder deaktiviert hat. Wenn Nutzer Standortaktualisierungen deaktiviert haben, können Sie sie über die Standortanforderungen Ihrer 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 eine Liste mit Location-Objekten, die den Breiten- und Längengrad des Standorts enthalten. Das folgende Snippet zeigt, wie Sie die Schnittstelle LocationCallback implementieren und die Methode definieren. Anschließend wird der Zeitstempel der Standortaktualisierung abgerufen und Breiten- und Längengrad sowie Zeitstempel in 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 Fokus ist, z. B. wenn der Nutzer zu einer anderen App oder zu einer anderen Aktivität in derselben App wechselt. Dies kann hilfreich sein, um den Stromverbrauch zu senken, sofern die App keine Informationen erheben muss, wenn sie im Hintergrund ausgeführt wird. In diesem Abschnitt erfahren Sie, wie Sie die Aktualisierungen in der onPause()-Methode der Aktivität beenden können.

Wenn Sie keine Standortaktualisierungen mehr erhalten möchten, rufen Sie removeLocationUpdates() auf und übergeben Sie einen 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 einen booleschen Wert, requestingLocationUpdates, um zu verfolgen, ob Standortaktualisierungen derzeit aktiviert sind. Prüfen Sie in der Methode onResume() 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. eine Änderung der Bildschirmausrichtung oder der Sprache, kann dazu führen, dass die aktuelle Aktivität beendet wird. Ihre App muss daher alle Informationen speichern, die zum Neuerstellen der Aktivität erforderlich sind. Eine Möglichkeit hierfür ist, den Instanzstatus in einem Bundle-Objekt zu speichern.

Das folgende Codebeispiel zeigt, wie der onSaveInstanceState()-Callback 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);
}

Definieren Sie eine updateValuesFromBundle()-Methode, um die gespeicherten Werte aus der vorherigen Instanz der Aktivität wiederherzustellen, sofern sie verfügbar sind. Rufen Sie die Methode über die Methode onCreate() 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 dauerhaft speichern möchten, können Sie sie im SharedPreferences Ihrer App speichern. Legen Sie die gemeinsam genutzte 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:

Produktproben

  • Beispiel-App, die zeigt, wie Standortaktualisierungen in Android empfangen werden.