Standortaktualisierungen anfordern

Die ordnungsgemäße Nutzung von Standortinformationen kann für Nutzer deiner App vorteilhaft sein. Wenn deine App beispielsweise dem Nutzer hilft, sich zu Fuß oder mit dem Auto zurechtzufinden, oder wenn deine App den Standort von Assets erfasst, 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 liefern, z. B. die Peilung (horizontale Reiserichtung), die Höhe oder die Geschwindigkeit des Geräts. Diese und weitere Informationen sind im Objekt Location verfügbar, das Ihre App vom Anbieter für kombinierte Standortbestimmung abrufen kann. Als Reaktion darauf aktualisiert die API Ihre App regelmäßig mit dem jeweils besten verfügbaren Standort. Grundlage hierfür sind derzeit verfügbare Standortanbieter wie WLAN und GPS (Global Positioning System). Die Genauigkeit des Standorts wird von den Anbietern, den 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 bietet eine praktische Basis für den Start. 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 den letzten bekannten Standort abrufen, indem Sie getLastLocation() aufrufen. Bei 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 Standortaktualisierungen angefordert werden, muss deine App eine Verbindung zu Standortdiensten herstellen und eine Standortanfrage senden. In der Lektion zum Ändern der Standorteinstellungen erfahren Sie, wie das geht. Sobald eine Standortanfrage erstellt ist, können Sie die regelmäßigen Aktualisierungen durch Aufrufen von requestLocationUpdates() starten.

Je nach Art der Anfrage ruft der Anbieter für kombinierte Standortbestimmung entweder die Callback-Methode LocationCallback.onLocationResult() auf und übergibt eine Liste von Location-Objekten oder gibt eine PendingIntent aus, die den Standort in den 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 mit dem Callback LocationCallback abrufen. Rufen Sie requestLocationUpdates() auf und übergeben Sie die Instanz des LocationRequest-Objekts. Außerdem wird ein LocationCallback ausgegeben. 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. Damit wird nachverfolgt, ob der Nutzer Standortupdates aktiviert oder deaktiviert hat. Wenn Nutzer Standortupdates deaktiviert haben, kannst du sie über die Standortanforderungen deiner App informieren. Weitere Informationen zum Beibehalten des Werts des booleschen Flags für Instanzen der Aktivität 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 Location-Listenobjekt mit dem Breiten- und Längengrad des Standorts. Im folgenden Snippet wird gezeigt, wie die Schnittstelle LocationCallback implementiert und die Methode definiert wird. Anschließend wird der Zeitstempel des Standortupdates abgerufen und auf der Benutzeroberfläche der App werden Breiten- und Längengrad sowie Zeitstempel 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 deaktivieren

Ü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 wechselt oder zu einer anderen Aktivität in derselben App wechselt. Das kann nützlich sein, um den Stromverbrauch zu reduzieren, sofern die App auch dann 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 stoppen können.

Wenn Sie keine Standortupdates mehr erhalten möchten, rufen Sie removeLocationUpdates() auf und übergeben Sie ein LocationCallback-Objekt, 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);
}

Mit dem booleschen Wert requestingLocationUpdates lässt sich nachvollziehen, ob Standortupdates derzeit aktiviert sind. Prüfen Sie in der onResume()-Methode der Aktivität, ob Standortupdates derzeit aktiv sind. Falls nicht, aktivieren Sie sie:

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 benötigt werden. Eine Möglichkeit dazu ist ein Instanzstatus, der in einem Bundle-Objekt gespeichert ist.

Das folgende Codebeispiel zeigt, wie Sie mit dem onSaveInstanceState()-Callback der Aktivität den Instanzstatus 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-Aktivitätsklasse.

Hinweis: Für einen längeren Speicher können Sie die Nutzereinstellungen in der Datei SharedPreferences Ihrer Anwendung speichern. Legen Sie die gemeinsame Einstellung in der onPause()-Methode 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 unter Android Standortaktualisierungen empfangen werden