导航实时数据监听模块提供一套完整的事件回调机制,用于监听导航过程中的各类实时事件(诱导、车速、路况、车道线等),并将数据以类型化接口形式传递给应用层。
接口设计原则:
对标 iOS BNaviModelDelegate 回调模式
所有监听回调均为可选(使用 ? 标记为可选方法)
数据结构采用简单对象设计,避免复杂嵌套
export interface BNINaviInterface {/*** 开始导航* @returns {Promise<boolean>} 是否成功启动*/startNavi: () => Promise<boolean>;/*** 停止导航* @returns {Promise<boolean>} 是否成功停止*/stopNavi: () => Promise<boolean>;/*** 添加导航实时数据监听器* @param listener 监听者,实现 BNINaviEventListener 接口*/addNaviDataListener(listener: BNINaviEventListener): void;/*** 移除导航实时数据监听器* @param listener 监听者*/removeNaviDataListener(listener: BNINaviEventListener): void;}
所有导航实时数据回调均在此接口中定义,按功能分为 14 个类别。
下一路口的转向引导信息更新回调。
参数:
interface BNIGuideInfo {nextRoadName: string; // 下一路口名字curRoadName: string; // 当前路名(顺行模式)nextNextRoadName: string; // 随后的下一路名turnIconName: string; // 转向标资源名称totalDist: number; // 该段路总长度,单位:米remainDist: number; // 距离下一路口剩余长度,单位:米remainTime: number; // 距离下一路口大概时间,单位:秒isStraight: boolean; // 是否处于顺行模式isStraightIcon: boolean; // 当前路口转向图标是否为直行类型nextTurnKind: BNManeuverKind; // 下一转向类型curTurnKind: BNManeuverKind; // 当前转向类型distCurToNextGP: number; // 当前机动点到下一机动点距离,单位:米isHighwayBeforeNextGP: boolean; // 当前机动点到下一机动点之间是否经过高速出口gpAddDist: number; // 机动点附加距离,单位:米}
车道线信息更新回调(从左到右顺序)。
参数:
action: 动作类型 ('SHOW' | 'UPDATE' | 'HIDE')
laneIcons: 车道图标列表
enum BNAction {SHOW = 'SHOW', // 显示UPDATE = 'UPDATE',// 更新HIDE = 'HIDE', // 隐藏}interface BNILaneIcon {resName: string; // 车道图标资源名称}
全程剩余时间和距离更新。
参数:
remainDistance: 剩余距离,单位:米
remainTime: 剩余时间,单位:秒
剩余红绿灯数量更新。
interface BNIRemainTrafficLightsInfo {count: number; // 剩余红绿灯数量}
定位信号状态更新(综合隧道、地库、卫星数量派生)。
参数:
enum BNSignalState {TUNNEL = 0, // 在隧道(VDR 定位)UNDERGROUND = 1, // 在地库WEAK = 2, // 信号弱(丢星或卫星数量少)MEDIUM = 3, // 信号中STRONG = 4, // 信号强}interface BNISignalInfo {state: BNSignalState;}
优先级:隧道 > 地库 > 丢星/弱 > 中 > 强
当前道路名称更新。
参数:
name: 当前道路名称(字符串)
GPS 速度与限速更新。
参数:
speed: 当前车速,单位:km/h(-1 表示速度不可信)
speedLimit: 当前路段限速,单位:km/h(0 表示无限速)
超速回调,1 km 内超速触发一次,无参数。
限速信息丢星。(注意:不是码表 UI 隐藏)
interface BNISpeedHideMsg {isHidden: boolean; // true = 丢星,false = 正常}
区间测速信息更新。
interface BNIIntervalSpeedInfo {action: string; // 'show' | 'update' | 'hide'speedLimit: number; // 区间限速值,单位:km/h(hide 时为 0)intervalLength: number; // 区间长度,单位:米(hide 时为 0)averageSpeed: number; // 当前区间平均速度,单位:km/h(show 时为 0)}
实时路况段信息更新。
参数:
progress: 车辆行驶进度,范围 0.0 - 1.0(对应 0% - 100%)
items: 路况段列表
interface BNIRoadCondition {index: number; // 路况段在整条路线中的终止索引type: number; // 0=畅通,1=缓慢,2=拥堵,3=严重拥堵}
路况条类型变化回调(当前车所在路况段的类型)。
参数:
roadConditionType: 路况类型(0/1/2/3)
高速面板数据更新(服务区、收费站、出口等)。
interface BNIHighwayPanelData {action: string; // 'SHOW' | 'UPDATE' | 'HIDE'topModel?: BNIHighwayContentData; // 第一个机动点信息bottomModel?: BNIHighwayContentData; // 第二个机动点信息(可选)}interface BNIHighwayContentData {highwayInfoType: number; // 面板类型(BNHighwayInfoType 数值)name: string; // 名称(服务区/收费站/出口)remainDist: number; // 剩余距离,单位:米}
主辅路与高架桥组合状态变化(任一发生变化就透出)。
interface BNIMainSlaveViaductInfo {roadStatus: number; // 0=不显示,1=主路,2=辅路bridgeStatus: number; // 0=不显示,1=桥上,2=桥下}
主辅路/高架桥切换结果回调。
interface BNIMainSlaveViaductChangeResult {isSuccess: boolean; // 是否切换成功}
主辅路切换提示(仅主辅路按钮出现时触发)。
interface BNIMainSlaveInfo {roadStatus: number; // 1=主路,2=辅路}
特殊触发条件:仅当 isShow && roadStatus !== 0 时触发
开始偏航回调。
参数:
yawingId(可选): 偏航标识
主路变化回调。
途经点/终点更新结果。
参数:
node: 途经点/终点节点
index: 途经点下标序号(从 1 开始)
error: 失败时的错误信息(可选)
刷新路线完成回调。
enum BNOtherRouteType {SWITCH_SUCCESS = 'SWITCH_SUCCESS', // 切换成功SWITCH_FAILED = 'SWITCH_FAILED', // 切换失败NEW_ROUTE = 'NEW_ROUTE', // 出现新路线NO_NEW_ROUTE = 'NO_NEW_ROUTE', // 无新路线}
重新算路成功,无参数。
重新算路失败,无参数。
车道级路线自动进入/退出。
参数:
isEntered: true = 进入车道级,false = 退出
车道级模式状态变化。
enum BNMultiMapsStatus {EXIT = 0, // 退出/2D 模式SINGLE = 1, // 3D 单屏模式MULTI = 2, // 分屏模式}
昼夜模式变化。
enum BNDayNightMode {DAY = 0, // 白天模式NIGHT = 1, // 夜间模式}
导航状态变化回调。
enum BNNaviStatusType {Invalid = 0,Begin = 1, // 导航开始Yawing = 2, // 偏航中ReRouteEnd = 3, // 偏航计算完成ReRouteCarFree = 4, // 车标自由状态End1 = 5, // 目的地接近End2 = 6, // 目的地到达BuildRoute = 7, // 导航中请求诱导AltRouteChanging = 8, // 导航中仅备选路线更新开始RouteChanging = 9, // 导航中含主线切换开始RouteChangedEnd = 10, // 导航中切换路线完成ExactGuide = 11, // 模糊引导绑定 linkFakeYawing = 12, // 静默偏航}enum BNNaviSightType {Invalid = 0,RealNavi = 1, // 真实导航DemoNavi = 2, // 模拟导航LightNavi = 3, // 路线雷达GenericNavi = 4, // 泛导航FuzzyNavi = 5, // 模糊导航CommuteNavi = 6, // 熟路导航IndoorParkNavi = 7, // 智能停车场导航}interface BNINaviStatusInfo {eNaviStatusType: BNNaviStatusType; // 导航状态eNaviSightType: BNNaviSightType; // 导航场景}
经过途经点/偏航时移除途经点消息。
interface BNIPassViaPointInfo {/*** 类型* - 1: 正常经过途经点* - 2: 偏航时该途经点被自动删除*/enType: number;viaIndex: number; // 途经点索引(从 0 开始)}
触发场景:
正常经过某个途经点(enType == 1)
接近途经点时发生偏航,SDK 自动丢弃该途经点(enType == 2)
class MyNaviListener implements BNINaviEventListener {// 诱导面板onSimpleGuideInfoChange(guideInfo: BNIGuideInfo) {console.log(`下一路口:${guideInfo.nextRoadName}`);console.log(`剩余距离:${guideInfo.remainDist}米`);}// 车速onGPSSpeedChange(speed: number, speedLimit: number) {console.log(`当前速度:${speed}km/h,限速:${speedLimit}km/h`);}onSpeedLimitReached() {console.log('超速警告');}// 路况onRoadConditionInfoChange(progress: number, items: BNIRoadCondition[]) {console.log(`行驶进度:${(progress * 100).toFixed(0)}%`);console.log(`路况段数:${items.length}`);}// 车道级onNavigationMapLaneStatusChange(isEntered: boolean) {console.log(isEntered ? '进入车道级' : '退出车道级');}// 路线变化onYawingDidStart(yawingId?: string) {console.log(`偏航开始:${yawingId}`);}onRecalculateRouteFinished() {console.log('重新算路成功');}onRecalculateRouteFailed() {console.log('重新算路失败');}onRouteDidChange(node: BNIRoutePlanNode, index: number, error?: Error) {if (error) {console.error(`途经点 ${index} 更新失败:${error.message}`);} else {console.log(`途经点 ${index} 已更新`);}}// 导航状态onNaviStatusChange(info: BNINaviStatusInfo) {const statusName = BNNaviStatusType[info.eNaviStatusType];const sightName = BNNaviSightType[info.eNaviSightType];console.log(`导航状态:${statusName},场景:${sightName}`);}}
// 获取导航实例const naviAbility = BNNaviAbility.getInstance();// 创建监听器const listener = new MyNaviListener();// 添加监听naviAbility.addNaviDataListener(listener);// ... 导航过程中持续接收回调 ...// 移除监听naviAbility.removeNaviDataListener(listener);
上一篇
下一篇