Skip to content

换路通知

功能介绍

导航过程中,当 SDK 开始、完成或取消一次路线更新(换路)时,通过 NavigationEventListener.onNavigationRouteUpdating 推送进度通知。常见场景包括:

  • 自动换路:偏航后更新路线、避开封闭交通/限时通行、EV 续航/充电站不可达等
  • 主动换路:用户接受 更优的路 提案(NavigationSession.acceptRouteProposal)、切换 备选路

HMI 应在此回调中刷新地图路线图层,并在 SUCCEEDED 时切换到 newRoute 继续导航。

onBetterRouteDetected 的区别: onBetterRouteDetected 仅表示检测到可选更优路线,需用户确认后才会换路;onNavigationRouteUpdating 表示换路流程已在进行或已结束,无论自动还是已确认的主动换路。

前置条件: 已按 真实导航与模拟导航 注册 NavigationEventListener 并处于导航会话中。

接口说明

1
fun onNavigationRouteUpdating(progress: BetterRouteUpdateProgress)

收到回调后先判断 progress.status,再读取其它字段(部分状态下其它字段无效)。

BetterRouteUpdateProgress.Status

状态 说明 HMI 建议
STARTED 当前路线不符合使用要求时,SDK 内部自动触发求路;STARTED 表示求路已开始 可展示 loading;结合 reasonbetterRouteContext 了解触发原因
SUCCEEDED 求路成功,新路已可用 使用 newRoute 刷新地图与导航 UI
FAILED 通常为求路失败,或新路仍不符合要求;SDK 可能在满足条件时重新触发求路 保留当前路线;newRoute 不可用;可按产品策略提示或静默等待下次通知
CANCELED 本次求路/换路已取消(如偏航触发更新路线过程中恢复沿路) 忽略本次更新,继续当前路线

BetterRouteUpdateProgress 字段

字段 说明
status 换路进度状态(必先看
reason 触发原因,见下表
newRoute 更新后的路线;SUCCEEDED 时有效
betterRouteContext 换路上下文(阻塞交通、限时路段、节省时长等)

Reason 触发原因

常量 说明
DEVIATION 偏航后更新路线
UPDATE_INTERNAL 内部因素触发的换路,例如:Content Switch(路线内容版本与当前地图数据版本不匹配,需重新求路对齐);Update guidance(路线引导信息不完整或需补全引导数据)
AVOID_BLOCKING_TRAFFIC 避开封闭/阻塞交通(含接受更优路提案后)
AVOID_TIMED_RESTRICTION 避开限时通行(参见 限时通行
SAVE_TIME 更优的路节省时间(参见 更优的路
ALTERNATIVE_ROUTE_SELECTED 用户选择备选路,或车辆直接驶入备选路(参见 备选路
INSUFFICIENT_BATTERY_LEVEL 仅 EV:当前电量不足以到达下一充电站/终点
RESUME_EV_TRIP_PLAN 仅 EV:EV 求路仅支持 Cloud;网络不佳时可能先用 Onboard 求普通路,待网络等条件恢复后重新恢复 EV 行程规划路线 时返回此 Reason
UPDATE_EV_TRIP_PLAN 仅 EV:EV 行程规划路线需更新(Cloud EV 求路),参见 EV导航
CHARGING_STATION_UNAVAILABLE 仅 EV:前方规划充电站不可用
LOW_ARRIVAL_BATTERY_LEVEL 仅 EV:预计到达电量过低

betterRouteContextRouteUpdateContext)常用字段

字段 说明
route 换路所基于的监控路线
blockingIncidents 当前路线上的阻塞性交通事件
blockingFlows 当前路线上的阻塞性交通流
timedRestrictionEdges 前方首个限时受限 edge
savedTime 新旧路线预计节省时间(秒)
batteryInsufficientInfo EV:电量不足信息
lowArrivalBatteryInfo EV:到达电量过低信息

流程概览

1
2
3
4
5
6
7
8
导航中触发换路(偏航 / 接受更优路 / 备选路 / EV 等)
        ↓
onNavigationRouteUpdating(status = STARTED)
        ↓
算路完成
        ↓
onNavigationRouteUpdating(status = SUCCEEDED, newRoute = …)   ← 刷新地图与引导
   或 status = FAILED / CANCELED

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
override fun onNavigationRouteUpdating(progress: BetterRouteUpdateProgress) {
    when (progress.status) {
        BetterRouteUpdateProgress.Status.STARTED -> {
            mainHandler.post { showRouteUpdatingIndicator(progress.reason) }
        }
        BetterRouteUpdateProgress.Status.SUCCEEDED -> {
            val route = progress.newRoute ?: return
            val previousRouteId = currentNavigationRoute?.id

            // 1. 更新 HMI 导航路线上下文(缓存 Route、highlightedRouteId、ViewModel 等)
            currentNavigationRoute = route
            navigationRouteLiveData.postValue(route)

            mainHandler.post {
                // 2. 刷新地图:旧路线 ID 变化时先移除,再绘制并高亮新路线
                if (previousRouteId != null && previousRouteId != route.id) {
                    mapView.routesController().remove(previousRouteId)
                }
                mapView.routesController().refresh(route)
                mapView.routesController().highlight(route.id)
                mapView.routesController().updateRouteProgress(route.id)

                hideRouteUpdatingIndicator()
            }
        }
        BetterRouteUpdateProgress.Status.FAILED -> {
            mainHandler.post {
                hideRouteUpdatingIndicator()
                showRouteUpdateFailedHint()
            }
        }
        BetterRouteUpdateProgress.Status.CANCELED -> {
            mainHandler.post { hideRouteUpdatingIndicator() }
        }
    }
}

注意事项

  • 回调线程: Message 线程,更新 UI / MapView 请切主线程。
  • 先读 status 勿在 STARTEDFAILED 时直接使用 newRoute
  • 路线 ID 变化: SUCCEEDEDnewRoute.id 可能与旧路线不同,需移除旧路线图层并高亮新路线(参考 SDK Examples BaseNavFragment)。
  • 联动回调: 换路成功后还可能触发 onTurnByTurnListUpdatedonNavigationEventUpdated 等,HMI 应以 newRoute 为准整表刷新。