Navigationsereignisse im Blick behalten

Ihre App kann auf Ereignisse reagieren, die auftreten, wenn der Nutzer einer Route folgt.

Übersicht

Verwenden Sie die folgenden Schnittstellen, um auf Navigationsereignisse zu warten:

Code

Ankunft an einem Ziel erkennen

Ein Ziel kann entweder ein Endziel oder ein Wegpunkt sein. Um die Ankunft zu erkennen, rufen Sie Navigator.addArrivalListener() auf. Dadurch wird ein Callback registriert, wenn das Gerät ein Ziel erreicht.

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

Wenn Sie continueToNextDestination() aufrufen, werden alle Informationen zum vorherigen Ziel verworfen. Wenn Sie Informationen zum vorherigen Routensegment 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 ein RoadSnappedLocationProvider von NavigationApi ab und rufen Sie dann RoadSnappedLocationProvider.addLocationListener() auf, um sich für einen Callback zu registrieren, wenn sich der Standort oder die Ausrichtung des Geräts ändert. Hinweis: Dieser Standort wird an eine Straße angepasst und kann sich daher vom 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 Standort-Update verfügbar ist, löst das Navigation SDK den onLocationChanged()-Callback aus.

Standortaktualisierungen, die an Straßen ausgerichtet sind, sind unabhängig von der Navigation und können auch nach dem Beenden der Navigation fortgesetzt werden. Wenn Sie Standortupdates abonnieren, kann dies zu einem erhöhten Akkuverbrauch, einem Speicherleck oder einer unbeabsichtigten Erhebung von Gerätestandortdaten führen, wenn Sie die Standortupdates im Hintergrund ausführen. 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 einen Callback zu registrieren, wenn sich die verbleibende Zeit (in Sekunden) oder Entfernung (in Metern) um mehr als einen bestimmten Grenzwert ändert.

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

Wenn Sie die verbleibende Zeit und Entfernung wissen möchten, rufen Sie Navigator.getTimeAndDistanceList() an. Die Zeiten und Entfernungen in der Liste sind kumulativ. Sie geben die Zeit und Entfernung vom aktuellen Standort zu jedem Wegpunkt an, nicht von einem Wegpunkt zum nächsten. Das TimeAndDistance-Objekt gibt jetzt auch delaySeverity zurück. Diese Enumeration kann „heavy“, „medium“, „light“ oder „unknown“ sein. Das entspricht der Farbe, die in der Kartenoberfläche für die geschätzte Ankunftszeit angezeigt wird (stark = rot, mittel = gelb, gering = grün). Das ist hilfreich, wenn Sie eine eigene ETA-Fußzeile erstellen müssen.

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

Mit der Methode setEtaCardEnabled() und dem Parameterwert TRUE können Sie die verbleibende Zeit und Entfernung auf dem integrierten Display anzeigen lassen. Wenn Sie die Anzeige von Zeit und Entfernung unterdrücken möchten, legen Sie diesen Wert auf FALSE fest.

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

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

Erkennen, wenn sich der Nachtmodus ändert

Rufen Sie NavigationView.addOnNightModeChangedListener oder SupportNavigationFragment.addOnNightModeChangedListener auf, um einen Callback zu registrieren, wenn sich der Nachtmodus ändert.

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

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 finden Sie unter Nachtmodus einstellen.