Cómo detectar eventos de navegación

Tu app puede escuchar eventos que ocurren a medida que el usuario navega por una ruta.

Descripción general

Usa las siguientes interfaces para escuchar eventos de navegación:

Consulta el código

Detecta la llegada a un destino

Aquí, un destino hace referencia a un destino final o a un punto de referencia. Para detectar la llegada, llama a Navigator.addArrivalListener(), que se registra para una devolución de llamada cuando el dispositivo llega a un destino.

Al llegar, el SDK de Navigation para Android activa la devolución de llamada onArrival() y detiene la guía paso a paso. Debes llamar explícitamente a Navigator.continueToNextDestination() para avanzar al siguiente punto de referencia y a Navigator.startGuidance() para continuar con la navegación paso a paso.

Cuando llamas a continueToNextDestination(), el navegador descarta toda la información sobre el destino anterior. Si deseas analizar información sobre el segmento de ruta anterior, debes recuperar la información del navegador antes de llamar a continueToNextDestination().

Para evitar fugas de memoria, debes llamar a removeArrivalListener(listener) cuando ya no necesites el objeto de escucha.

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

Recibe actualizaciones de ubicación

Obtén un objeto RoadSnappedLocationProvider del NavigationApi y, luego, llama a RoadSnappedLocationProvider.addLocationListener() para registrarte para recibir una devolución de llamada cuando cambie la ubicación o el rumbo del dispositivo. Ten en cuenta que esta ubicación se ajusta a una ruta y, por lo tanto, puede ser diferente de la que muestra el proveedor de ubicación combinada en las APIs de ubicación de los Servicios de Google Play.

El SDK de Navigation proporciona actualizaciones de ubicación con la mayor frecuencia posible. Cuando hay una actualización de ubicación disponible, el SDK de Navigation activa la devolución de llamada onLocationChanged().

Las actualizaciones de ubicación ajustadas a la ruta son independientes de la navegación y pueden continuar incluso después de que esta se haya detenido. Suscribirse a las actualizaciones de ubicación puede provocar un agotamiento de la batería, una fuga de memoria o una recopilación no intencional de datos de ubicación del dispositivo si las actualizaciones de ubicación se ejecutan en segundo plano. Llama a RoadSnappedLocationProvider.removeLocationListener cuando ya no necesites el objeto de escucha.

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

Recibe actualizaciones de tiempo y distancia

Llama a Navigator.addRemainingTimeOrDistanceChangedListener() para registrarte y recibir una devolución de llamada cuando el tiempo restante (segundos) o la distancia (metros) cambie más que un umbral determinado.

Cuando el cambio en el tiempo o la distancia supera el importe especificado, el SDK de Navigation activa la devolución de llamada onRemainingTimeOrDistanceChanged().

Para ver el tiempo y la distancia restantes, llama a Navigator.getTimeAndDistanceList(). Ten en cuenta que los tiempos y las distancias de la lista son acumulativos: muestran el tiempo y la distancia desde la ubicación actual hasta cada punto de referencia, no de un punto a otro. El objeto TimeAndDistance ahora también muestra delaySeverity. Esta enum será pesada, media, ligera o desconocida. Corresponde al color que ves en el ETA en la IU de los mapas (pesado = rojo, medio = amarillo, claro = verde). Esto es útil si necesitas crear tu propio pie de página de ETA.

Para evitar fugas de memoria, debes llamar a Navigator.removeRemainingTimeOrDistanceChangedListener(listener) cuando ya no necesites el objeto de escucha.

En el siguiente ejemplo, se solicita una devolución de llamada si el tiempo restante cambia en más de 60 segundos o la distancia restante cambia en más de 100 metros.

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

Puedes mostrar la información sobre el tiempo y la distancia restantes en la pantalla integrada con el método setEtaCardEnabled() y pasando un parámetro con el valor TRUE. Para suprimir la visualización de tiempo/distancia, establece este valor en FALSE.

También puedes exponer la hora de llegada estimada para varios puntos de referencia con el método getTimeAndDistanceList().

Recibe actualizaciones de rutas

Llama a Navigator.addRouteChangedListener() si quieres registrarte para una devolución de llamada cuando cambie la ruta.

Cuando cambia la ruta, el SDK de Navigation activa la devolución de llamada onRouteChanged(). Puedes llamar a Navigator.getRouteSegments y Navigator.getCurrentRouteSegment() para encontrar la ruta nueva.

Para evitar fugas de memoria, debes llamar a removeRouteChangedListener(listener) cuando ya no necesites el objeto de escucha.

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

Cómo detectar cuándo cambia el modo nocturno

Llama a NavigationView.addOnNightModeChangedListener o SupportNavigationFragment.addOnNightModeChangedListener para registrarte y recibir una devolución de llamada cuando cambie el modo nocturno.

En el siguiente ejemplo, se muestra la detección de cambios en el modo nocturno en un fragmento de Navigation.

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