Standortaktualisierungen anfordern

Die ordnungsgemäße Verwendung von Standortinformationen kann für Nutzer Ihres Wenn Ihre App z. B. Nutzern hilft, sich beim Gehen oder oder wenn Ihre App den Standort von Assets erfasst, Standort des Geräts in regelmäßigen Abständen. 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 finden Sie in der Location , das Ihre App aus dem fusioniert Standortanbieter. Als Antwort aktualisiert die API Ihre App regelmäßig mit den besten verfügbaren Standort basierend auf dem derzeit verfügbaren Standort wie WiFi und GPS (Global Positioning System, GPS). 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 letzte bekannte Standort des Geräts ist eine praktische Basis, von der aus das Gerät und achte darauf, dass die App einen bekannten Standort hat, bevor du regelmäßige Standortaktualisierungen Die Lektion zur Unter Letzten bekannten Standort abrufen sehen Sie, wie finde ich den letzten bekannten Standort? getLastLocation() Bei den Snippets in den folgenden Abschnitten wird davon ausgegangen, dass Ihre App den letzten bekannten Standort abgerufen und als Location-Objekt in der globalen Variablen mCurrentLocation.

Standortanfrage stellen

Bevor du Standortupdates anfordern kannst, muss deine App eine Verbindung zum Standort herstellen und eine Standortanfrage stellen. Die Lektion zur Standorteinstellungen ändern wie das geht. Sobald eine Standortanfrage vorliegt, können Sie erhalten Sie über den Aufruf requestLocationUpdates()

Je nach Art der Anfrage hat der Anbieter für kombinierte Standortbestimmung ruft die Methode LocationCallback.onLocationResult() und übergibt ihr eine Liste mit Location-Objekten. Probleme ein PendingIntent die den Standort in den 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());
}

Beachten Sie, dass sich das obige Code-Snippet auf ein boolesches Flag bezieht, requestingLocationUpdates – wird verwendet, um nachzuverfolgen, ob der Nutzer den Standort geändert hat ein- oder ausschalten. Falls Nutzer Standortupdates deaktiviert haben, können Sie sie darüber informieren. Standortanforderungen deiner App. Für mehr über das Beibehalten des Wertes des booleschen Flags für Instanzen des finden Sie unter Status der Aktivität speichern.

Callback für Standortaktualisierung 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. Das folgende Snippet zeigt Ihnen, wie Sie die LocationCallback Oberfläche und definieren die Methode. Rufen Sie dann den Zeitstempel des Standortupdates ab. sowie Breiten-, Längengrad und Zeitstempel für die Nutzer Ihrer App Schnittstelle:

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 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 Updates 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);
}

Verwenden Sie den booleschen Wert requestingLocationUpdates zum Erfassen ob Standortupdates derzeit aktiviert sind. In der onResume()-Methode, prüfen ob Standortaktualisierungen derzeit aktiv sind, und aktivieren Sie sie, wenn nicht:

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 auf dem Bildschirm Ausrichtung oder Sprache, können dazu führen, dass die aktuelle Aktivität zerstört wird. Ihr App muss daher alle Informationen speichern, die sie benötigt, um die Aktivität zu reproduzieren. Eine Möglichkeit dazu ist ein Instanzstatus, der in einem Bundle-Objekt.

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);
}

updateValuesFromBundle()-Methode für die Wiederherstellung definieren die gespeicherten Werte aus der vorherigen Instanz der Aktivität, verfügbar. Rufen Sie die Methode über die onCreate(), wie in den folgenden Codebeispiel:

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 Aktivitätsklasse.

Hinweis:Wenn Sie mehr Daten möchten, die Einstellungen der Nutzenden im SharedPreferences 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

  • Beispiel-App, die zeigt, wie unter Android Standortaktualisierungen empfangen werden