Standortaktualisierungen anfordern

Die ordnungsgemäße 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 der geografischen Standort (Breiten- und Längengrad) angeben, können Sie dem Nutzer z. B. Peilung (horizontale Fahrtrichtung), Höhe oder Geschwindigkeit des Geräts. 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 der wird der Standort von den Anbietern bestimmt, von Ihnen erteilte Berechtigungen zur Standortermittlung angefordert und den Optionen, die Sie in der Standortanfrage festgelegt haben.

In dieser Lektion erfahren Sie, wie Sie regelmäßige Updates Standort mithilfe der requestLocationUpdates() im Anbieter für kombinierte Standortbestimmung.

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. Die Lektion zur Unter Letzten bekannten Standort abrufen sehen Sie, wie finde ich den letzten bekannten Standort? getLastLocation() 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.

Standortabfrage stellen

Bevor Standortaktualisierungen angefordert werden können, muss Ihre App eine Verbindung zu Standortdiensten herstellen und eine Standortanfrage stellen. Die Lektion zur Standorteinstellungen ändern 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 von Die Updates werden von den angeforderten Berechtigungen zur Standortermittlung und dem Optionen, die Sie im Objekt zur Standortanfrage festgelegt haben.

In dieser Lektion erfahren Sie, wie Sie das Update mithilfe der LocationCallback Callback-Ansatz ausprobieren. Anruf requestLocationUpdates(), Ihre Instanz des LocationRequest Objekt, und 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 alle Instanzen der Aktivität finden Sie unter Status der Aktivität speichern.

Callback für Standortaktualisierungen definieren

Der Anbieter für kombinierte Standortbestimmung ruft den Parameter LocationCallback.onLocationResult() . Das eingehende Argument enthält die Liste Location. -Objekt, das den Breiten- und Längengrad des Standorts enthält. 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 stoppen möchten, wenn die Aktivität nicht mehr im Fokus sind, z. B. wenn der Nutzer zu einer anderen App oder verschiedenen Aktivitäten in derselben App. Dies kann praktisch sein, um vorausgesetzt, die App muss keine Informationen erheben, auch wenn im Hintergrund ausgeführt wird. In diesem Abschnitt erfahren Sie, wie Sie in der Aktivität onPause()-Methode.

Wenn du keine Standortupdates mehr erhalten möchtest, rufe removeLocationUpdates(), ihm eine LocationCallback, Dies wird 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 einem 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. Ihr App muss daher alle Informationen speichern, die sie benötigt, um die Aktivität zu reproduzieren. Eine Möglichkeit hierfür ist ein Instanzstatus, der in einem Bundle-Objekt gespeichert ist.

Das folgende Codebeispiel zeigt, wie Sie die Methode onSaveInstanceState() Callback auf, 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 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 Android Activity-Klasse.

Hinweis: Für einen länger anhaltenden Speicher können Sie die Einstellungen des Nutzers in der SharedPreferences Ihrer App speichern. Legen Sie die Freigabeeinstellung fest in Die onPause()-Methode Ihrer Aktivität und ruft die Einstellung in onResume() ab. Weitere Informationen zum Speichern von Einstellungen finden Sie unter Wird gespeichert... Schlüssel/Wert-Paare.

Weitere Informationen

Weitere Informationen finden Sie in den folgenden Ressourcen:

Produktproben

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