Как отслеживать события навигации

Приложение может отслеживать события, которые происходят, когда пользователь движется по маршруту.

Обзор

Для прослушивания событий навигации используйте следующие интерфейсы:

  • Navigator.ArrivalListener предоставляет обратный вызов onArrival(), который активируется, когда устройство прибывает в пункт назначения.
  • RoadSnappedLocationProvider.LocationListener предоставляет обратный вызов onLocationChanged(), который активируется при изменении местоположения устройства.
  • Navigator.RemainingTimeOrDistanceChangedListener предоставляет обратный вызов onRemainingTimeOrDistanceChanged(), который активируется, когда время или расстояние до следующего пункта назначения изменяется больше, чем на заданную величину.
  • Navigator.RouteChangedListener предоставляет обратный вызов onRouteChanged(), который активируется при изменении маршрута.

Посмотреть код

Определять прибытие в пункт назначения

В данном случае под пунктом назначения понимается как конечный пункт, так и путевая точка. Чтобы определить прибытие, вызовите Navigator.addArrivalListener(), который регистрирует обратный вызов, когда устройство достигает пункта назначения.

По прибытии Navigation SDK для Android запускает обратный вызов onArrival(), который можно использовать, чтобы остановить пошаговую навигацию с помощью Navigator.stopGuidance() или перейти к следующей путевой точке с помощью Navigator.continueToNextDestination(). Если в сеансе навигации был только один пункт назначения или в списке пунктов назначения больше ничего не осталось, вызов Navigator.continueToNextDestination() автоматически останавливает ведение по маршруту.

При вызове continueToNextDestination() навигатор удаляет всю информацию о предыдущем пункте назначения. Если вы хотите проанализировать информацию о предыдущем сегменте маршрута, вам необходимо получить информацию из навигатора перед вызовом continueToNextDestination().

Чтобы избежать утечки памяти, вызовите removeArrivalListener(listener), когда прослушиватель больше не нужен.

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

Обновление данных о местоположении

Получите объект RoadSnappedLocationProvider из NavigationApi, а затем вызовите RoadSnappedLocationProvider.addLocationListener(), чтобы зарегистрировать обратный вызов, который будет выполняться при изменении местоположения или направления движения устройства. Обратите внимание, что это местоположение привязано к дороге и поэтому может отличаться от местоположения, возвращаемого поставщиком геоданных из нескольких источников в Location API сервисов Google Play.

Navigation SDK обновляет данные о местоположении как можно чаще. Когда доступно обновление местоположения, Navigation SDK запускает обратный вызов onLocationChanged().

Обновления местоположения с привязкой к дороге не зависят от навигации и могут продолжаться даже после ее остановки. Если вы оставите уведомления о местоположении включенными в фоновом режиме, это может привести к разрядке батареи, утечке памяти или непреднамеренному сбору данных о местоположении устройства. Когда прослушиватель больше не нужен, вызовите RoadSnappedLocationProvider.removeLocationListener.

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

Получайте информацию о времени и расстоянии

Вызовите метод Navigator.addRemainingTimeOrDistanceChangedListener(), чтобы зарегистрировать обратный вызов, когда оставшееся время (в секундах) или расстояние (в метрах) изменится больше, чем на заданное пороговое значение.

Когда изменение времени или расстояния превышает указанное значение, Navigation SDK запускает обратный вызов onRemainingTimeOrDistanceChanged().

Чтобы узнать оставшееся время и расстояние, вызовите Navigator.getTimeAndDistanceList(). Обратите внимание, что время и расстояние в списке являются совокупными: они показывают время и расстояние от текущего местоположения до каждой путевой точки, а не от одной путевой точки до другой. Объект TimeAndDistance также возвращает delaySeverity. Это перечисление может принимать значения HEAVY, MEDIUM, LIGHT или UNKNOWN. Это соответствует цвету, который вы видите для расчетного времени прибытия в интерфейсе Карт (высокая – красный, средняя – желтый, низкая – зеленый). Это полезно, если вам нужно создать собственный нижний колонтитул с расчетным временем прибытия.

Чтобы избежать утечки памяти, вызовите Navigator.removeRemainingTimeOrDistanceChangedListener(listener), когда прослушиватель больше не нужен.

В следующем примере обратный вызов запрашивается, если оставшееся время изменяется более чем на 60 секунд или оставшееся расстояние изменяется более чем на 100 метров.

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

Вы можете показывать информацию об оставшемся времени и расстоянии на встроенном дисплее с помощью метода setEtaCardEnabled(), передав параметр со значением TRUE. Чтобы скрыть время и расстояние, задайте значение FALSE.

Вы также можете показывать расчетное время прибытия для нескольких путевых точек с помощью метода getTimeAndDistanceList().

Получать обновления маршрута

Вызовите метод Navigator.addRouteChangedListener(), чтобы зарегистрировать обратный вызов при изменении маршрута.

При изменении маршрута Navigation SDK запускает обратный вызов onRouteChanged(). Чтобы найти новый маршрут, можно вызвать Navigator.getRouteSegments и Navigator.getCurrentRouteSegment().

Чтобы избежать утечки памяти, вызовите removeRouteChangedListener(listener), когда прослушиватель больше не нужен.

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

Как определить, когда меняется ночной режим

Вызовите метод NavigationView.addOnNightModeChangedListener или NavigationFragment.addOnNightModeChangedListener, чтобы зарегистрировать обратный вызов при изменении ночного режима.

В следующем примере показано, как отслеживать изменения ночного режима во фрагменте навигации.

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

Вы также можете настроить ночной режим программно. Подробнее о ночном режиме…