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

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

Обзор

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

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

См. код

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

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

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

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

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

Чтобы узнать оставшееся время и расстояние, вызовите Navigator.getTimeAndDistanceList() . Обратите внимание, что время и расстояние в списке являются кумулятивными: они показывают время и расстояние от текущего местоположения до каждой путевой точки, а не от одной путевой точки до другой. Объект TimeAndDistance теперь также возвращает delaySeverity . Это перечисление будет иметь значения heavy, medium, light или unknown. Это соответствует цвету, который вы видите на eta в пользовательском интерфейсе карт (heavy = красный, medium = желтый, light = зеленый). Это полезно, если вам нужно создать собственный нижний колонтитул 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 .

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

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

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

При изменении маршрута 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);
    }
});

Также можно установить ночной режим программно. Для получения дополнительной информации см. раздел «Установка ночного режима» .