Écouter les événements de navigation

Votre application peut écouter les événements qui se produisent lorsque l'utilisateur parcourt 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 soit une destination finale, soit 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 le guidage détaillé. 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 d'itinéraire 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 enregistrer un rappel lorsque l'emplacement ou le cap de l'appareil change. Notez que cet emplacement est aligné sur une route et peut donc être différent de celui 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 des routes fermées sont indépendantes de la navigation et peuvent se poursuivre même après l'arrêt de la navigation. Si vous vous abonnez aux mises à jour de la position, cela peut entraîner une décharge de la batterie, une fuite de mémoire ou la 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 informations sur le temps et la distance

Appelez Navigator.addRemainingTimeOrDistanceChangedListener() pour demander à recevoir un rappel lorsque le temps restant (en secondes) ou la distance (mètres) restants dépasse 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 durées et les distances de 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. Désormais, l'objet TimeAndDistance renvoie également delaySeverity. Cette énumération sera lourde, moyenne, légère ou inconnue. Cela correspond à la couleur que vous voyez sur l'heure d'arrivée dans l'interface utilisateur de Google Maps (lourd = rouge, moyen = jaune, clair = vert). Cela est utile si vous devez créer votre propre pied de page d'ATA.

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 de temps et de distance restantes à l'aide de l'écran intégré en utilisant la méthode setEtaCardEnabled() et en transmettant un paramètre avec la valeur TRUE. Pour masquer l'affichage de l'heure et de la distance, définissez cette valeur sur FALSE.

Vous pouvez également afficher 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 rechercher 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 enregistrer 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);
    }
});
.