Слушайте навигационные события

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

Обзор

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

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

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

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

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

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

Когда вы вызываете 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() , чтобы зарегистрироваться для обратного вызова при изменении местоположения или направления устройства. Обратите внимание, что это местоположение привязано к дороге, поэтому оно может отличаться от местоположения, возвращаемого поставщиком объединенного местоположения в 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 . Это перечисление будет тяжелым, средним, легким или неизвестным. Это соответствует цвету, который вы видите на ETA в пользовательском интерфейсе карты (тяжелый = красный, средний = желтый, светлый = зеленый). Это полезно, если вам нужно создать собственный нижний колонтитул ETA.

Чтобы избежать утечек памяти, вы должны вызвать 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 .

Вы также можете предоставить ETA для нескольких путевых точек, используя метод 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 или SupportNavigationFragment.addOnNightModeChangedListener , чтобы зарегистрироваться для обратного вызова при изменении ночного режима.

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

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