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 reagieren:

Code

Ankunft an einem Ziel erkennen

Hier bezieht sich ein Ziel entweder auf ein endgültiges Ziel oder einen Wegpunkt. Rufen Sie Navigator.addArrivalListener() auf, um die Ankunft zu erkennen. Dadurch wird ein Callback registriert, der ausgelöst wird, wenn das Gerät ein Ziel erreicht.

Bei der Ankunft löst das Navigation SDK for Android den onArrival()-Callback aus. Mit diesem Callback können Sie die detaillierte Wegbeschreibung entweder mit Navigator.stopGuidance() beenden oder mit Navigator.continueToNextDestination() zum nächsten Wegpunkt wechseln. Wenn die Navigationssitzung nur ein einziges Ziel enthielt oder keine Ziele mehr in der Liste der Ziele vorhanden sind, wird die Wegbeschreibung durch Aufrufen von Navigator.continueToNextDestination() automatisch beendet.

Wenn Sie continueToNextDestination() aufrufen, verwirft der Navigator alle Informationen zum vorherigen Ziel. 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 erhalten

Rufen Sie einen RoadSnappedLocationProvider von der NavigationApi ab und rufen Sie dann RoadSnappedLocationProvider.addLocationListener() auf, um einen Callback zu registrieren, der ausgelöst wird, wenn sich der Standort oder die Richtung des Geräts ändert. Beachten Sie, dass dieser Standort an eine Straße angepasst wird und sich daher vom Standort unterscheiden kann, der vom kombinierten Standortanbieter in den Standort-APIs von Google Play-Diensten zurückgegeben wird.

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

An Straßen angepasste Standortaktualisierungen sind unabhängig von der Navigation und können auch nach dem Beenden der Navigation fortgesetzt werden. Wenn Sie Standortaktualisierungen im Hintergrund ausführen, kann dies zu einer schnelleren Entladung des Akkus, einem Speicherleck oder einer unbeabsichtigten Erfassung 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 einen Callback zu registrieren, der ausgelöst wird, wenn sich die verbleibende Zeit (in Sekunden) oder Entfernung (in Metern) um mehr als einen bestimmten Schwellenwert ändert.

Wenn die Änderung der Zeit oder Entfernung den angegebenen Betrag überschreitet, löst das Navigation SDK den onRemainingTimeOrDistanceChanged() Callback 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 TimeAndDistance-Objekt gibt jetzt auch delaySeverity zurück. Dieses Enum kann „heavy“, „medium“, „light“ oder „unknown“ sein. Das entspricht der Farbe, die Sie in der Kartenbenutzeroberfläche für die voraussichtliche Ankunftszeit sehen (stark = rot, mittel = gelb, leicht = grün). Das ist hilfreich, wenn Sie eine eigene Fußzeile für die voraussichtliche Ankunftszeit 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);
            }
        });

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

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

Routenaktualisierungen erhalten

Rufen Sie Navigator.addRouteChangedListener() auf, um einen Callback zu registrieren, der ausgelöst wird, 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);
    }
});

Änderungen des Nachtmodus erkennen

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

Im folgenden Beispiel wird gezeigt, wie Sie auf Änderungen des Nachtmodus in einem Navigationsfragment 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 festlegen.