Navigationsereignisse im Blick behalten

Ihre App kann auf Ereignisse warten, die auftreten, wenn der Nutzer auf einer Route navigiert.

Überblick

Verwenden Sie die folgenden Oberflächen, um Navigationsereignisse zu überwachen:

Code

Ankunft an einem Ziel erkennen

Als Ziel wird hier entweder ein endgültiges Ziel oder ein Wegpunkt bezeichnet. Um eine Ankunft zu erkennen, rufen Sie Navigator.addArrivalListener() auf, das für einen Rückruf registriert wird, wenn das Gerät ein Ziel erreicht.

Nach der Ankunft löst das Navigation SDK for Android den onArrival()-Callback aus und stoppt die detaillierte Routenführung. Sie müssen explizit Navigator.continueToNextDestination() aufrufen, um zum nächsten Wegpunkt zu gelangen, und Navigator.startGuidance(), um die detaillierte Routenführung fortzusetzen.

Wenn Sie continueToNextDestination() aufrufen, verwirft der Navigator alle Informationen zum vorherigen Ziel. Wenn Sie Informationen zum vorherigen Routenabschnitt analysieren möchten, müssen Sie diese vor dem continueToNextDestination()-Aufruf aus dem Navigationsmenü abrufen.

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 vom NavigationApi ab und rufen Sie dann RoadSnappedLocationProvider.addLocationListener() auf, um sich für einen Callback zu registrieren, wenn sich der Standort oder die Richtung des Geräts ändert. Dieser Standort ist an eine Straße gebunden 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 onLocationChanged()-Callback aus.

Updates für den Standort an einer Straße sind unabhängig von der Navigation und können auch dann fortgesetzt werden, wenn die Navigation beendet wurde. Das Abonnieren von Standortupdates kann zu einer schnellen Akkuentladung, zu Speicherlecks oder zur unbeabsichtigten Erfassung von Gerätestandortdaten führen, wenn die Standortaktualisierungen im Hintergrund ausgeführt werden. 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);
}

Updates 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 die Entfernung (Meter) um mehr als einen bestimmten Grenzwert ändert.

Wenn die Zeit- oder Streckenänderung den angegebenen Wert überschreitet, löst das Navigation SDK den onRemainingTimeOrDistanceChanged()-Callback aus.

Die verbleibende Zeit und die verbleibende Entfernung erhalten Sie, indem Sie Navigator.getTimeAndDistanceList() aufrufen. Die Zeiten und Entfernungen in der Liste sind kumulativ: Sie zeigen die Zeit und Entfernung zwischen dem aktuellen Standort und jedem Wegpunkt an, nicht von einem Wegpunkt zum anderen. Das TimeAndDistance-Objekt gibt jetzt auch delaySeverity zurück. Diese Aufzählung ist entweder „Heavy“, „meduim“, „ leicht“ oder „unbekannt“. Dies entspricht der Farbe, die Sie auf der ETA in der Karten-UI sehen (schwer = rot, mittel = gelb, hell = grün). Dies ist hilfreich, wenn Sie Ihre eigene ETA-Fußzeile erstellen müssen.

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

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 auf der integrierten Anzeige Informationen zur verbleibenden Zeit und zur Entfernung einblenden. Dazu verwenden Sie die Methode setEtaCardEnabled() und übergeben einen Parameter mit dem Wert TRUE. Wenn die Zeit-/Entfernungsanzeige unterdrückt werden soll, setze diesen Wert auf FALSE.

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

Aktualisierte Routen erhalten

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

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

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 sich für einen Rückruf zu registrieren, wenn sich der Nachtmodus ändert.

Das folgende Beispiel zeigt, wie Sie bei einem Navigationsfragment auf Nachtmodusänderungen achten.

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