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 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.