Standortaktualisierungen anfordern

Die angemessene Verwendung von Standortinformationen kann für die Nutzer deiner App von Vorteil sein. Wenn deine App Nutzern beispielsweise hilft, den richtigen Weg zu finden, wenn sie zu Fuß oder mit dem Auto unterwegs sind, oder wenn deine 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) sollten Sie dem Nutzer noch weitere Informationen zur Verfügung stellen, z. B. die Lage (horizontale Fahrtrichtung), die Höhe oder die Geschwindigkeit des Geräts. Diese und weitere Informationen sind im Objekt Location verfügbar, das deine App vom Anbieter für kombinierte Standortbestimmung abrufen kann. Die API aktualisiert die App dann regelmäßig mit dem jeweils besten verfügbaren Standort, basierend auf den derzeit verfügbaren Standortanbietern wie WLAN und GPS (Global Positioning System). Die Genauigkeit des Standorts wird von den Anbietern, den von Ihnen angeforderten Berechtigungen zur Standortermittlung und den 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 letzte bekannte Standort des Geräts ist eine praktische Ausgangsbasis, von der aus du anfangen kannst. So wird sichergestellt, dass die App einen bekannten Standort hat, bevor die regelmäßigen Standortaktualisierungen gestartet werden. In der Lektion Letzten bekannten Standort abrufen erfahren Sie, wie Sie getLastLocation() aufrufen, um den letzten bekannten Standort abzurufen. Bei den Snippets in den folgenden Abschnitten wird davon ausgegangen, dass deine App den letzten bekannten Standort bereits abgerufen und als Location-Objekt in der globalen Variablen mCurrentLocation gespeichert hat.

Standortanfrage stellen

Bevor Standortaktualisierungen angefordert werden können, muss Ihre App eine Verbindung zu Standortdiensten herstellen und eine Standortanfrage stellen. In der Lektion zum Ändern der Standorteinstellungen wird beschrieben, wie Sie das tun. Sobald eine Standortanfrage erstellt wurde, kannst du die regelmäßigen Updates starten, indem du requestLocationUpdates() aufrufst.

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 ein PendingIntent aus, das den Standort in seinen erweiterten Daten enthält. Die Genauigkeit und Häufigkeit der Updates hängt von den von dir angeforderten Berechtigungen zur Standortermittlung und den Optionen ab, die du im Objekt für die Standortanfrage festgelegt hast.

In dieser Lektion erfahren Sie, wie Sie das Update mit dem Callback LocationCallback abrufen. Rufen Sie requestLocationUpdates() auf und übergeben Sie Ihre Instanz des LocationRequest-Objekts sowie 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());
}

Das Code-Snippet oben bezieht sich auf das boolesche Flag requestingLocationUpdates, mit dem erfasst wird, ob der Nutzer Standortupdates aktiviert oder deaktiviert hat. Wenn Nutzer Standortupdates 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 Aktivitätsstatus speichern.

Callback für Standortaktualisierung festlegen

Der Anbieter für kombinierte Standortbestimmung ruft die Callback-Methode LocationCallback.onLocationResult() auf. Das eingehende Argument enthält ein Listenobjekt Location, das den Breiten- und Längengrad des Standorts enthält. Das folgende Snippet zeigt, wie Sie die LocationCallback-Schnittstelle implementieren und die Methode definieren, dann den Zeitstempel der Standortaktualisierung abrufen und den Breiten- und Längengrad sowie den Zeitstempel in der Benutzeroberfläche Ihrer Anwendung anzeigen lassen:

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 stoppen

Überlegen Sie, ob Sie die Standortaktualisierungen stoppen 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. Das kann hilfreich sein, um den Stromverbrauch zu reduzieren, da die App auch dann keine Daten 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 stoppen können.

Wenn du Standortaktualisierungen verhindern möchtest, musst du removeLocationUpdates() aufrufen und dabei einen LocationCallback übergeben, wie im folgenden Codebeispiel veranschaulicht:

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 dem booleschen Wert requestingLocationUpdates kannst du feststellen, ob Standortaktualisierungen derzeit aktiviert sind. Prüfen Sie in der Methode onResume() der Aktivität, ob Standortaktualisierungen derzeit aktiv sind, und aktivieren Sie sie andernfalls:

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 gelöscht wird. Ihre Anwendung muss daher alle Informationen speichern, die zum Neuerstellen der Aktivität erforderlich sind. Eine Möglichkeit dafür ist ein Instanzstatus, der in einem Bundle-Objekt gespeichert ist.

Das folgende Codebeispiel zeigt, wie Sie den onSaveInstanceState()-Callback der Aktivität verwenden, 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, falls 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 Klassenreferenz zu Android Activity.

Hinweis: Wenn der Speicher länger dauert, kannst du die Einstellungen des Nutzers in der Datei SharedPreferences deiner Anwendung speichern. Legen Sie die gemeinsame Einstellung in der Methode onPause() 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.

Weitere Informationen

Weitere Informationen finden Sie in den folgenden Ressourcen:

Produktproben

  • Beispiel-App zur Veranschaulichung des Empfangs von Standortupdates in Android