监听导航事件

您的应用可以监听用户沿着路线导航时发生的事件。

概览

使用以下接口监听导航事件:

查看代码

检测到达目的地

在这里,目的地是指最终目的地或航点。接收者 检测到达、调用 Navigator.addArrivalListener()、 该函数会在设备到达目的地时注册回调。

抵达后,将触发 Navigation SDK for 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();
        }
    }
});

接收位置信息更新

从以下位置获取 RoadSnappedLocationProviderNavigationApi,然后调用 RoadSnappedLocationProvider.addLocationListener() 在设备的位置或方向发生变化时注册回调。 请注意,此位置与道路对应,因此可能不同于 Google Play 中的一体化位置信息提供程序返回的位置信息 服务地理位置 API。

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。此枚举将 为 shuffle、meduim、轻度或未知。该颜色与您 查看地图界面中的预计到达时间(深色主题 = 红色,中 = 黄色,浅色 = 绿色)。这是 如果您需要创建自己的加大型文字广告页脚,可以执行此操作。

为避免内存泄漏,您必须调用 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.getRouteSegmentsNavigator.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.addOnNightModeChangedListenerSupportNavigationFragment.addOnNightModeChangedListener 在夜间模式发生变化时注册回调。

以下示例展示了如何在 导航 fragment。

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