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

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

Consulta el código

Cómo detectar la llegada a un destino

Aquí, un destino hace referencia a un destino final o un punto de referencia. Para detectar la llegada, llamar 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 se activa la devolución de llamada onArrival() y detiene la guía paso a paso. Debes llamar de manera explícita Navigator.continueToNextDestination() para avanzar hasta el siguiente punto de referencia y Navigator.startGuidance() para continuar con la navegación paso a paso.

Cuando llamas a continueToNextDestination(), el navegador descarta todo. información sobre el destino anterior. Si quieres analizar información sobre el tramo de ruta anterior, debes recuperar la información desde el navegador antes de llamar a continueToNextDestination().

Para evitar fugas de memoria, debes llamar a removeArrivalListener(listener) cuando no lo hagas ya no necesitarás al 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, luego llama RoadSnappedLocationProvider.addLocationListener() para registrarse para una devolución de llamada cuando cambia 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 Google Play y las APIs de ubicación de servicios.

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

Las actualizaciones de ubicación en la ruta son independientes de la navegación y pueden continuar incluso después de que se haya detenido la navegación. Si te suscribes a las actualizaciones de ubicación, es posible que provoque el agotamiento de la batería, una fuga de memoria o la recopilación involuntaria de la ubicación del dispositivo. si deja que las actualizaciones de ubicación se ejecuten en segundo plano. Llamada 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 registrarse para una devolución de llamada cuando el tiempo restante (segundos) o la distancia (metros) cambia por más de un umbral determinado.

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

Para consultar el tiempo y la distancia restantes, llama Navigator.getTimeAndDistanceList() Ten en cuenta que los tiempos y las distancias de la lista son acumulativos: muestran el tiempo y la distancia de la ubicación actual a cada punto de referencia, no de un punto de referencia a otro. El objeto TimeAndDistance ahora también muestra delaySeverity. Esta enumeración puede ser pesado, medio, ligero o desconocido. Esto corresponde al color que ver en eta en la IU de Maps (pesado = rojo, medio = amarillo, claro = verde). Este es útil si necesita crear su 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.

La siguiente muestra solicita una devolución de llamada si el tiempo restante cambia en más de 60 segundos o la distancia restante cambia 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 con el pantalla con el método setEtaCardEnabled() y pasar un parámetro con el valor TRUE. Para suprimir el tiempo/distancia mostrar, establece este valor en FALSE.

También puedes mostrar la hora de llegada estimada para varios puntos de referencia utilizando el getTimeAndDistanceList().

Recibe actualizaciones de rutas

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

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

Para evitar fugas de memoria, debes llamar a removeRouteChangedListener(listener) cuando no lo hagas ya no necesitarás al 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 registrarse y recibir 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 una de navegación.

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