Navigationsereignisse im Blick behalten

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

Übersicht

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

Code

Ankunft an einem Ziel erkennen

Hier bezeichnet ein Ziel entweder ein endgültiges Ziel oder einen Wegpunkt. Zur Erkennung der Ankunft rufen Sie Navigator.addArrivalListener() auf. Dadurch wird ein Callback registriert, 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() sagen, um zum nächsten Wegpunkt zu gelangen, und Navigator.startGuidance(), um mit der detaillierten Routenführung fortzufahren.

Wenn Sie continueToNextDestination() aufrufen, verwirft der Navigationsgerät alle Informationen zum vorherigen Ziel. Wenn Sie Informationen zum vorherigen Routensegment analysieren möchten, müssen Sie die Informationen aus dem 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

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. Dieser Standort ist an eine 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 aktualisiert den Standort so oft wie möglich. Wenn ein Standortupdate verfügbar ist, löst das Navigation SDK den Callback 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 die Standortermittlung im Hintergrund laufen lassen, kann dies 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);
}

Aktuelle Informationen 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 Grenzwert ändert.

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

Um die verbleibende Zeit und Strecke zu ermitteln, rufen Sie Navigator.getTimeAndDistanceList() auf. Die Zeitangaben und Entfernungen in der Liste sind kumulativ: Sie zeigen die Zeit und die Entfernung zwischen dem aktuellen Standort und den einzelnen Wegpunkten an, nicht zwischen den einzelnen Wegpunkten. Das TimeAndDistance-Objekt gibt jetzt auch delaySeverity zurück. Diese Aufzählung ist entweder „Heavy“, „Meduim“, „Light“ oder „Unbekannt“. Das entspricht der Farbe, die Sie für die voraussichtliche Ankunftszeit 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.

Zur Vermeidung von Speicherlecks müssen Sie Navigator.removeRemainingTimeOrDistanceChangedListener(listener) aufrufen, wenn Sie den Listener nicht mehr benötigen.

Im folgenden Beispiel 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);
            }
        });

Die verbleibenden Zeit- und Streckeninformationen lassen sich auf dem integrierten Display mit der Methode setEtaCardEnabled() aufrufen. Dabei wird ein Parameter mit dem Wert TRUE übergeben. Wenn die Zeit- und Entfernungsanzeige nicht angezeigt werden soll, setzen Sie diesen Wert auf FALSE.

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

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 onRouteChanged()-Callback aus. Sie können Navigator.getRouteSegments und Navigator.getCurrentRouteSegment() aufrufen, um die neue Route zu ermitteln.

Zur Vermeidung von Speicherlecks 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 Callback beim Wechsel des Nachtmodus anzumelden.

Das folgende Beispiel zeigt das Überwachen von Nachtmodusänderungen in einem Navigationsfragment.

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

Der Nachtmodus lässt sich auch programmatisch einrichten. Weitere Informationen finden Sie unter Nachtmodus festlegen.