Cómo detectar eventos de navegación

Tu app puede detectar los eventos que ocurren mientras el usuario navega por una ruta.

Descripción general

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

Consulta el código

Detecta la llegada a un destino

Aquí, un destino se refiere 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 onArrival() devolución de llamada, que se puede usar para detener la guía paso a paso con Navigator.stopGuidance() o para avanzar al siguiente punto de referencia con Navigator.continueToNextDestination(). Si la sesión de navegación solo incluía un destino o si no quedan destinos en la lista, llamar a Navigator.continueToNextDestination() detiene automáticamente la guía.

Cuando llamas a continueToNextDestination(), el navegador descarta toda la información sobre el destino anterior. Si deseas analizar la información sobre el segmento de ruta anterior, debes recuperarla 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();
        }
    }
});

Cómo recibir actualizaciones de ubicación

Obtén un RoadSnappedLocationProvider de la NavigationApi y, luego, llama a RoadSnappedLocationProvider.addLocationListener() para registrarte para una devolución de llamada cuando cambie la ubicación o la orientación del dispositivo. Ten en cuenta que esta ubicación se ajusta a una ruta, por lo que puede ser diferente de la ubicación 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 ubicación actualizada disponible, el SDK de Navigation activa la onLocationChanged() devolución de llamada.

Las actualizaciones de ubicación ajustadas a la ruta son independientes de la navegación y pueden continuar incluso después de que se detiene la navegación. Si te suscribes a las actualizaciones de ubicación, es posible que se produzca agotamiento de la batería, una fuga de memoria o se recopilen datos de ubicación del dispositivo de forma involuntaria si dejas las actualizaciones de ubicación ejecutándose 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);
}

Cómo recibir actualizaciones de tiempo y distancia

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

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

Para encontrar 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 ruta, no de un punto de ruta a otro. El objeto TimeAndDistance ahora también muestra delaySeverity. Esta enumeración será intensa, intermedia, ligera o desconocida. Esto corresponde al color que ves en la hora estimada de llegada en la IU de Maps (intenso = rojo, intermedio = amarillo, ligero = verde). Esto es útil si necesitas crear tu propio pie de página de la hora estimada de llegada.

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 si 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 del tiempo y la distancia restantes con la pantalla integrada mediante el método setEtaCardEnabled() y pasar un parámetro con el valor TRUE. Para suprimir la visualización del tiempo y la distancia, establece este valor en FALSE.

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

Cómo recibir actualizaciones de rutas

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

Cuando cambia la ruta, el SDK de Navigation activa la onRouteChanged() devolución de llamada. 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);
    }
});

Detecta cuándo cambia el modo nocturno

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

En el siguiente ejemplo, se muestra cómo detectar cambios en el modo nocturno en un fragmento de navegación.

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

También puedes configurar el modo nocturno de forma programática. Para obtener más información, consulta Cómo configurar el modo nocturno.