Écouter les événements de navigation

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

Présentation

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

Voir le code

Détecter l'arrivée à une destination

Ici, une destination désigne une destination finale ou un point de cheminement. Pour détecter l'arrivée, appelez Navigator.addArrivalListener(), qui enregistre 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 détaillées. Vous devez appeler explicitement Navigator.continueToNextDestination() pour passer au point de cheminement suivant et Navigator.startGuidance() pour continuer 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 de parcours précédent, vous devez les récupérer auprès 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 le cap de l'appareil change. Notez que cette position est alignée sur une route et qu'elle peut donc être différente de celle renvoyée par le Fused Location Provider dans les API de localisation des services Google Play.

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

Les mises à jour de position avec géorepérage sont indépendantes de la navigation et peuvent se poursuivre même après l'arrêt de la navigation. S'abonner aux notifications de position peut entraîner une décharge de la batterie, une fuite de mémoire ou une collecte involontaire de données de localisation de l'appareil si vous laissez les notifications 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 informations sur le temps et la distance

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

Lorsque la modification du temps ou de la 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 temps et distances de la liste sont cumulatifs: ils indiquent le temps et la distance entre l'emplacement actuel et chaque point de cheminement, et non d'un point de cheminement à un autre. L'objet TimeAndDistance renvoie désormais également delaySeverity. Cette énumération peut être "heavy", "medium", "light" ou "unknown". Cela correspond à la couleur que vous voyez sur l'ETA dans l'interface utilisateur de Maps (fort = rouge, moyen = jaune, faible = vert). Cela peut être utile si vous devez créer votre propre pied de page d'estimation de l'heure d'arrivée.

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 change de plus de 60 secondes ou si la distance restante change 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 sur le temps et la distance restants à l'aide de l'écran intégré à l'aide de la méthode setEtaCardEnabled() et en transmettant un paramètre avec la valeur TRUE. Pour supprimer l'affichage de l'heure et 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 les itinéraires

Appelez Navigator.addRouteChangedListener() pour vous inscrire à un rappel lorsque l'itinéraire change.

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

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 les changements de mode Nuit

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

L'exemple suivant montre comment écouter les modifications du 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);
    }
});

Vous pouvez également définir le mode Nuit de manière programmatique. Pour en savoir plus, consultez Définir le mode Nuit.