Écouter les événements de navigation

Votre application peut écouter les événements qui se produisent lorsque l'utilisateur suit l'itinéraire.

Présentation

Utilisez les interfaces suivantes pour écouter les événements de navigation:

Voir le code

Détecter l'arrivée à destination

Ici, une destination fait référence à une destination finale ou à un point de cheminement. Pour détecter l'arrivée, appelez Navigator.addArrivalListener(), qui s'enregistre pour recevoir un rappel lorsque l'appareil atteint une destination.

À l'arrivée, le SDK Navigation pour Android déclenche le rappel onArrival() et arrête les instructions de navigation détaillées. Vous devez appeler explicitement Navigator.continueToNextDestination() pour passer au point de cheminement suivant et Navigator.startGuidance() pour poursuivre la navigation détaillée.

Lorsque vous appelez continueToNextDestination(), le navigateur supprime toutes les informations sur la destination précédente. Si vous souhaitez analyser des informations sur le segment d'itinéraire précédent, vous devez les récupérer à partir du navigateur avant d'appeler continueToNextDestination().

Pour éviter les fuites de mémoire, vous devez appeler removeArrivalListener(listener) lorsque vous n'avez plus besoin de l'écouteur.

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

Recevoir des mises à jour de localisation

Obtenez un RoadSnappedLocationProvider à partir de NavigationApi, puis appelez RoadSnappedLocationProvider.addLocationListener() pour vous inscrire à un rappel lorsque l'emplacement ou la direction de l'appareil change. Notez que cet emplacement est ancré à une route. Il peut donc être différent de l'emplacement renvoyé par Fused Location Provider dans les API de localisation des services Google Play.

Le SDK Navigation fournit des mises à jour de la position aussi souvent que possible. Lorsqu'une mise à jour de la position est disponible, le SDK Navigation déclenche le rappel onLocationChanged().

Les mises à jour de position signalées par une route sont indépendantes de la navigation et peuvent se poursuivre même après l'arrêt de la navigation. L'abonnement aux notifications de position peut entraîner une décharge de la batterie, une fuite de mémoire ou une collecte involontaire des données de localisation de l'appareil si vous laissez les mises à jour de position s'exécuter en arrière-plan. Appelez RoadSnappedLocationProvider.removeLocationListener lorsque vous n'avez plus besoin de l'écouteur.

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

Recevoir des mises à jour sur l'heure et la distance

Appelez Navigator.addRemainingTimeOrDistanceChangedListener() pour vous inscrire à un rappel lorsque le temps (secondes) ou la distance (mètres) restants changent de plus d'un seuil donné.

Lorsque le changement de temps ou de distance dépasse la valeur spécifiée, le SDK Navigation déclenche le rappel onRemainingTimeOrDistanceChanged().

Pour connaître le temps et la distance restants, appelez Navigator.getTimeAndDistanceList(). Notez que les durées et les distances indiquées dans la liste sont cumulatives: elles indiquent la durée et la distance entre la position actuelle et chaque point de cheminement, et non d'un point de cheminement à un autre. L'objet TimeAndDistance renvoie désormais delaySeverity. Cette énumération peut être "heavy", "méduim", "light" ou "inconnu". Il correspond à la couleur que vous voyez sur l'heure d'arrivée prévue dans l'interface utilisateur de Maps (fort = rouge, moyen = jaune, clair = vert). Cela peut être utile si vous devez créer votre propre pied de page pour l'heure d'arrivée prévue.

Pour éviter les fuites de mémoire, vous devez appeler Navigator.removeRemainingTimeOrDistanceChangedListener(listener) lorsque vous n'avez plus besoin de l'écouteur.

L'exemple ci-dessous demande un rappel si le temps restant varie de plus de 60 secondes ou si la distance restante varie de plus de 100 mètres.

mNavigator.addRemainingTimeOrDistanceChangedListener(60, 100,
        new Navigator.RemainingTimeOrDistanceChangedListener() {
            @Override
            public void onRemainingTimeOrDistanceChanged() {
                displayMessage("onRemainingTimeOrDistanceChanged: Time or distance estimate"
                        + " has changed.",
                        DISPLAY_LOG);
            }
        });

Vous pouvez afficher les informations de temps et de distance restants à l'aide de l'écran intégré en utilisant la méthode setEtaCardEnabled() et en transmettant un paramètre avec la valeur TRUE. Pour supprimer l'affichage du temps/de la distance, définissez cette valeur sur FALSE.

Vous pouvez également exposer l'heure d'arrivée prévue pour plusieurs points de cheminement à l'aide de la méthode getTimeAndDistanceList().

Recevoir des informations sur l'itinéraire

Appelez Navigator.addRouteChangedListener() pour vous inscrire à un rappel lorsque la route change.

Lorsque l'itinéraire change, le SDK Navigation déclenche le rappel onRouteChanged(). Vous pouvez appeler Navigator.getRouteSegments et Navigator.getCurrentRouteSegment() pour trouver la nouvelle route.

Pour éviter les fuites de mémoire, vous devez appeler removeRouteChangedListener(listener) lorsque vous n'avez plus besoin de l'écouteur.

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

Détecter quand le mode Nuit change

Appelez NavigationView.addOnNightModeChangedListener ou SupportNavigationFragment.addOnNightModeChangedListener pour vous inscrire à un rappel lorsque le mode Nuit change.

L'exemple suivant montre comment écouter les changements de mode Nuit sur un fragment de navigation.

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