É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 à 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'inscrit à un rappel lorsque l'appareil atteint une destination.

À l'arrivée, le SDK Navigation pour Android déclenche le onArrival() rappel, qui peut ensuite être utilisé pour arrêter la navigation détaillée à l'aide de Navigator.stopGuidance() ou pour passer au point de cheminement suivant à l'aide de Navigator.continueToNextDestination(). Si la session de navigation ne comportait qu'une seule destination ou s'il n'y a plus de destinations dans la liste, l'appel de Navigator.continueToNextDestination() arrête automatiquement le guidage.

Lorsque vous appelez continueToNextDestination(), le navigateur ignore 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 vous inscrire à un rappel lorsque la position ou le cap de l'appareil change. Notez que cette position est associée à une route et qu'elle peut donc être différente de celle renvoyée par Fused Location Provider dans les API de localisation des services Google Play.

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

Les mises à jour de localisation associées à une route sont indépendantes de la navigation et peuvent se poursuivre même après l'arrêt de la navigation. Si vous laissez les mises à jour de localisation s'exécuter en arrière-plan, l'abonnement à ces mises à jour 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. 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 de l'heure et de 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 variation de temps ou de distance dépasse le montant spécifié, le SDK Navigation déclenche le onRemainingTimeOrDistanceChanged() rappel.

Pour connaître le temps et la distance restants, appelez Navigator.getTimeAndDistanceList(). Notez que les temps et les distances de la liste sont cumulatifs : ils indiquent le temps 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 également delaySeverity. Cette énumération peut être "heavy" (abondant), "medium" (moyen), "light" (léger) ou "unknown" (inconnu). Cela correspond à la couleur que vous voyez sur l'heure d'arrivée prévue dans l'interface utilisateur Maps (abondant = rouge, moyen = jaune, léger = vert). Cela est utile si vous devez créer votre propre pied de page pour l'heure d'arrivée estimé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'affichage intégré en utilisant la méthode setEtaCardEnabled() et en transmettant un paramètre avec la valeur TRUE. Pour supprimer l'affichage du temps et de la distance, définissez cette valeur sur FALSE.

Vous pouvez également exposer l'heure d'arrivée estimée pour plusieurs points de repère à l'aide de la getTimeAndDistanceList() méthode.

Recevoir des mises à jour d'itinéraire

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

Lorsque l'itinéraire change, le SDK Navigation déclenche le onRouteChanged() rappel. 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 le changement 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 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);
    }
});

Vous pouvez également définir le mode Nuit par programmation. Pour en savoir plus, consultez Définir le mode Nuit.