Navigationsereignisse im Blick behalten

Ihre App kann Ereignisse beobachten, die auftreten, während der Nutzer einer Route folgt.

Übersicht

Verwenden Sie die folgenden Schnittstellen, um Navigationsereignisse zu erfassen:

Code

Ankunft an einem Ziel erkennen

Ein Ziel ist hier entweder ein Endziel oder ein Wegpunkt. Wenn Sie die Ankunft erkennen möchten, rufen Sie Navigator.addArrivalListener() auf. Dadurch wird ein Callback registriert, wenn das Gerät ein Ziel erreicht.

Bei der Ankunft löst das Navigation SDK for Android den Callback onArrival() aus. Dieser kann dann verwendet werden, um entweder die detaillierte Routenführung mit Navigator.stopGuidance() zu beenden oder mit Navigator.continueToNextDestination() zum nächsten Wegpunkt zu wechseln. Wenn die Navigationssitzung nur ein Ziel enthielt oder keine Ziele mehr in der Zielliste vorhanden sind, wird die Zielführung durch den Aufruf von Navigator.continueToNextDestination() automatisch beendet.

Wenn Sie continueToNextDestination() aufrufen, werden alle Informationen zum vorherigen Ziel verworfen. Wenn Sie Informationen zum vorherigen Routenabschnitt analysieren möchten, müssen Sie die Informationen vom Navigator abrufen, bevor Sie continueToNextDestination() aufrufen.

Um Speicherlecks zu vermeiden, müssen Sie removeArrivalListener(listener) aufrufen, wenn Sie den Listener nicht mehr benötigen.

mNavigator.addArrivalListener(new Navigator.ArrivalListener() {
    @Override
    public void onArrival(ArrivalEvent arrivalEvent) {
        displayMessage("onArrival: You've arrived at a waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_BOTH);
        // Start turn-by-turn guidance for the next leg of the route.
        if (arrivalEvent.isFinalDestination()) {
            displayMessage("onArrival: You've arrived at the final destination.",
                    DISPLAY_BOTH);
        } else {
            mNavigator.continueToNextDestination();
            mNavigator.startGuidance();
        }
    }
});

Standortaktualisierungen empfangen

Rufen Sie einen RoadSnappedLocationProvider aus dem NavigationApi ab und rufen Sie dann RoadSnappedLocationProvider.addLocationListener() auf, um sich für einen Callback zu registrieren, wenn sich der Standort oder die Fahrtrichtung des Geräts ändert. Dieser Standort wird an einer Straße ausgerichtet und kann sich daher von dem Standort unterscheiden, der vom Anbieter für kombinierte Standortbestimmung in den Standort-APIs der Google Play-Dienste zurückgegeben wird.

Das Navigation SDK stellt Standortaktualisierungen so oft wie möglich bereit. Wenn ein Standortupdate verfügbar ist, löst das Navigation SDK den Callback onLocationChanged() aus.

An Straßen ausgerichtete Standortaktualisierungen sind unabhängig von der Navigation und können auch nach Beendigung der Navigation fortgesetzt werden. Wenn Sie Standort-Updates abonnieren, kann dies zu einer Entladung des Akkus, einem Speicherleck oder einer unbeabsichtigten Erfassung von Gerätestandortdaten führen, wenn Sie die Standort-Updates im Hintergrund laufen lassen. Rufen Sie RoadSnappedLocationProvider.removeLocationListener auf, wenn Sie den Listener nicht mehr benötigen.

mRoadSnappedLocationProvider =
        NavigationApi.getRoadSnappedLocationProvider(getApplication());
if (mRoadSnappedLocationProvider != null) {
    mRoadSnappedLocationProvider.addLocationListener(
            new RoadSnappedLocationProvider.LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    displayMessage("onLocationUpdated: Navigation engine has provided a new"
                                    +   " road-snapped location: "
                                    +   location.toString(),
                            DISPLAY_LOG);
                }
            });
} else {
    displayMessage("ERROR: Failed to get a location provider", DISPLAY_LOG);
}

Aktualisierungen zu Zeit und Entfernung erhalten

Rufen Sie Navigator.addRemainingTimeOrDistanceChangedListener() auf, um sich für einen Callback zu registrieren, wenn sich die verbleibende Zeit (Sekunden) oder Entfernung (Meter) um mehr als einen bestimmten Schwellenwert ändert.

Wenn die Änderung der Zeit oder Entfernung den angegebenen Wert überschreitet, löst das Navigation SDK den Callback onRemainingTimeOrDistanceChanged() aus.

Rufen Sie Navigator.getTimeAndDistanceList() auf, um die verbleibende Zeit und Entfernung zu ermitteln. Die Zeiten und Entfernungen in der Liste sind kumulativ: Sie zeigen die Zeit und Entfernung vom aktuellen Standort zu jedem Wegpunkt, nicht von einem Wegpunkt zum anderen. Das Objekt TimeAndDistance gibt auch delaySeverity zurück. Dieses Enum ist entweder HEAVY, MEDIUM, LIGHT oder UNKNOWN. Dies entspricht der Farbe, die Sie für die voraussichtliche Ankunftszeit in der Maps-Benutzeroberfläche sehen (stark = rot, mittel = gelb, leicht = grün). Das ist hilfreich, wenn Sie eine eigene Fußzeile für die voraussichtliche Ankunftszeit erstellen möchten.

Um Speicherlecks zu vermeiden, müssen Sie Navigator.removeRemainingTimeOrDistanceChangedListener(listener) aufrufen, wenn Sie den Listener nicht mehr benötigen.

Im folgenden Beispiel wird ein Callback angefordert, wenn sich die verbleibende Zeit um mehr als 60 Sekunden oder die verbleibende Entfernung um mehr als 100 Meter ändert.

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        +   " has changed.",
                        DISPLAY_LOG);
            }
        });

Sie können Informationen zur verbleibenden Zeit und Entfernung mit der Methode setEtaCardEnabled() und einem Parameter mit dem Wert TRUE auf dem integrierten Display anzeigen lassen. Wenn Sie die Anzeige von Zeit und Entfernung unterdrücken möchten, setzen Sie diesen Wert auf FALSE.

Sie können die voraussichtliche Ankunftszeit für mehrere Wegpunkte auch mit der Methode getTimeAndDistanceList() anzeigen lassen.

Aktuelle Informationen zur Route erhalten

Rufen Sie Navigator.addRouteChangedListener() auf, um sich für einen Callback zu registrieren, wenn sich die Route ändert.

Wenn sich die Route ändert, löst das Navigation SDK den Callback onRouteChanged() aus. Sie können Navigator.getRouteSegments und Navigator.getCurrentRouteSegment() aufrufen, um die neue Route zu finden.

Um Speicherlecks zu vermeiden, müssen Sie removeRouteChangedListener(listener) aufrufen, wenn Sie den Listener nicht mehr benötigen.

mNavigator.addRouteChangedListener(new Navigator.RouteChangedListener() {
    @Override
    public void onRouteChanged() {
        displayMessage("onRouteChanged: The driver's route has changed. Current waypoint: "
                +   mNavigator.getCurrentRouteSegment().getDestinationWaypoint().getTitle(),
                DISPLAY_LOG);
    }
});

Änderungen des Nachtmodus erkennen

Rufe NavigationView.addOnNightModeChangedListener oder NavigationFragment.addOnNightModeChangedListener auf, um einen Callback zu registrieren, wenn sich der Nachtmodus ändert.

Im folgenden Beispiel wird gezeigt, wie Sie auf Änderungen des Nachtmodus in einem Navigationsfragment warten.

mNavFragment.addOnNightModeChangedListener(new NavigationView.OnNightModeChangedListener() {
    @Override
    public void onNightModeChanged(NightModeChangedEvent nightModeChangedEvent) {
        displayMessage("Night mode is active: " + nightModeChangedEvent.inNightMode(),
        DISPLAY_LOG);
    }
});

Sie können den Nachtmodus auch programmatisch festlegen. Weitere Informationen findest du unter Nachtmodus festlegen.