Navigationsereignisse im Blick behalten

Ihre App kann Ereignisse erfassen, die auftreten, während der Nutzer eine Route befährt.

Übersicht

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

Code

Ankunft an einem Ziel erkennen

Ein Ziel bezieht sich hier entweder auf ein Endziel oder einen Wegpunkt. Rufen Sie Navigator.addArrivalListener() auf, um die Ankunft zu erkennen. Dadurch wird ein Callback registriert, wenn das Gerät ein Ziel erreicht.

Nach der Ankunft löst das Navigation SDK for Android den Rückruf onArrival() aus und beendet die Schritt-für-Schritt-Navigation. Sie müssen Navigator.continueToNextDestination() ausdrücklich aufrufen, um zum nächsten Wegpunkt zu gelangen, und Navigator.startGuidance(), um die detaillierte Navigation fortzusetzen.

Wenn Sie continueToNextDestination() aufrufen, werden alle Informationen zum vorherigen Ziel gelöscht. Wenn Sie Informationen zum vorherigen Routensegment analysieren möchten, müssen Sie die Informationen aus dem Navigationssystem 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

Rufe vom NavigationApi eine RoadSnappedLocationProvider ab und rufe dann RoadSnappedLocationProvider.addLocationListener() auf, um dich für einen Rückruf zu registrieren, wenn sich der Standort oder die Richtung des Geräts ändert. Hinweis: Dieser Standort ist an eine Straße angedockt 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 Navigations-SDK stellt Standortaktualisierungen so oft wie möglich bereit. Wenn ein Standortupdate verfügbar ist, löst das Navigations-SDK den Rückruf onLocationChanged() aus.

Standortaktualisierungen anhand von Straßen sind unabhängig von der Navigation und können auch nach dem Beenden der Navigation fortgesetzt werden. Wenn Sie Standortupdates abonnieren und diese im Hintergrund laufen lassen, kann das zu einer Akkuentladung, einem Speicherleck oder zur unbeabsichtigten Erhebung von Gerätestandortdaten fü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 sich für einen Rückruf anzumelden, wenn sich die verbleibende Zeit (in Sekunden) oder die Entfernung (in Metern) um mehr als einen bestimmten Grenzwert ändert.

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

Wenn Sie die verbleibende Zeit und Entfernung erfahren möchten, tippen Sie auf Navigator.getTimeAndDistanceList(). 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. Dieser Enum-Wert kann „heavy“, „medium“, „light“ oder „unknown“ sein. Dieser Wert entspricht der Farbe, die Sie in der Maps-Benutzeroberfläche für die geschätzte Ankunftszeit sehen (dunkel = rot, mittel = gelb, hell = grün). Das ist hilfreich, wenn Sie Ihre eigene ETA-Fußzeile erstellen möchten.

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

Im Beispiel unten wird ein Rückruf 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 die verbleibende Zeit und die Entfernungsinformationen auf dem integrierten Display anzeigen lassen, indem Sie die Methode setEtaCardEnabled() verwenden und einen Parameter mit dem Wert TRUE übergeben. Wenn die Zeit- und Entfernungsanzeige nicht angezeigt werden soll, legen Sie diesen Wert auf FALSE fest.

Mit der Methode getTimeAndDistanceList() können Sie auch die geschätzte Ankunftszeit für mehrere Wegpunkte anzeigen.

Informationen zu Routen erhalten

Rufen Sie Navigator.addRouteChangedListener() auf, um sich für einen Rückruf anzumelden, wenn sich die Route ändert.

Wenn sich die Route ändert, löst das Navigations-SDK den Rückruf 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 der Nachtmodus geändert wird

Rufen Sie NavigationView.addOnNightModeChangedListener oder SupportNavigationFragment.addOnNightModeChangedListener an, um sich für einen Rückruf anzumelden, wenn sich der Nachtmodus ändert.

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

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 festlegen.