Standortaktualisierungen anfordern

Die angemessene 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 dem geografischen Standort (Breiten- und Längengrad) können Sie den Nutzern weitere Informationen wie die Peilung (horizontale Fahrtrichtung), 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. 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 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 fusionierten Standortanbieter regelmäßige Updates zum Standort eines Geräts anfordern.

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. 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 können, muss Ihre App eine Verbindung zu Standortdiensten herstellen und eine Standortanfrage stellen. In der Lektion Standorteinstellungen ändern erfahren Sie, 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 der Aktualisierungen hängen von den von Ihnen angeforderten Standortberechtigungen und den Optionen ab, die Sie im Objekt für Standortanfragen festgelegt haben.

In dieser Lektion erfahren Sie, wie Sie das Update mit dem LocationCallback-Callback-Ansatz abrufen. Rufen Sie requestLocationUpdates() auf und übergeben Sie die Instanz des LocationRequest-Objekts und einen 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 Instanzen der Aktivität finden Sie unter Status der Aktivität speichern.

Callback für Standortaktualisierungen definieren

Der Anbieter für die kombinierte Standortbestimmung ruft die Callback-Methode LocationCallback.onLocationResult() auf. Das eingehende Argument enthält ein Listen-Location-Objekt mit dem Breiten- und Längengrad des Standorts. 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 anhalten 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 die Standortaktualisierungen beenden möchten, rufen Sie removeLocationUpdates() auf und übergeben Sie ihm 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);
}

Mit dem 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. Ihre App muss daher alle Informationen speichern, die zum Nachstellen der Aktivität erforderlich sind. Eine Möglichkeit hierfür 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 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 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.

Weitere Informationen

Weitere Informationen finden Sie in den folgenden Ressourcen:

Produktproben

  • Beispielanwendung, die den Empfang von Standortaktualisierungen unter Android demonstriert.