路线规划成功后,就可以使用专业导航服务,专业导航服务依赖App的页面生命周期,开发时,只需要将百度导航SDK专业导航生命周期接口挂接到对应页面的生命周期接口即可,App页面既可以是Activity,也可以是Fragment等。生命周期如下。
1生命周期
/** * 获取百度专业导航过程View对象,将其加入应用布局内即可显示导航过程. */ View onCreate(final FragmentActivity activity, final BNGuideConfig config); /** * 百度专业导航生命周期onStart,在{@linkplain Activity#onStart()} 或者 {@linkplain Fragment#onStart()} 中调用 */ void onStart(); /** * 百度专业导航生命周期onResume,在{@linkplain Activity#onResume()} 或者 {@linkplain Fragment#onResume()} 中调用 */ void onResume(); /** * 百度专业导航生命周期onPause,在{@linkplain Activity#onPause()} 或者 {@linkplain Fragment#onPause()} 中调用 */ void onPause(); /** * 百度专业导航生命周期onStop,在{@linkplain Activity#onStop()} 或者 {@linkplain Fragment#onStop()} 中调用 */ void onStop(); /** * 百度专业导航生命周期oonDestroy,在{@linkplain Activity#onDestroy()} 或者 {@linkplain Fragment#onDestroy()} 中调用 * * @param isSwitchToLightNavi 在退出专业导航后是否切换到轻导航 */ void onDestroy(boolean isSwitchToLightNavi);
2重要参数和方法说明
以下是专业导航IBNRouteGuideManager相对重要的方法介绍,更多参数和方法请您关注[参考手册]。
专业导航onCreate方法
专业导航onCreate方法BNGuideConfig参数如下
/** * 支持专业导航旧版ui自定义view * @param params 定制化导航参数 * @param callback 添加工具箱上方自定义view * @param leftCallback 添加左下角自定义view * @param bottomCallback 添加最底部自定义view */ private BNGuideConfig(Bundle params, IBNRouteGuideManager.NaviAddViewCallback callback, IBNRouteGuideManager.NaviAddViewCallback leftCallback, IBNRouteGuideManager.NaviAddViewCallback bottomCallback)
其中带NaviAddViewCallback的重载方法表示可以在专业导航界面添加自定义view,带Bundle的重载方法可以传入一些参数来自定义导航。具体可传入的参数如下:
Bundle bundle = new Bundle(); bundle.putBoolean(BNaviCommonParams.ProGuideKey.ADD_MAP, false); bundle.putBoolean(BNaviCommonParams.ProGuideKey.IS_SUPPORT_FULL_SCREEN, supportFullScreen()); BNGuideConfig config = new BNGuideConfig.Builder() .params(bundle) .addLeftViewCallback(new IBNRouteGuideManager.NaviAddViewCallback() { @Override public View getAddedView() { return getCustomView(); } }) .addBBottomViewCallback(new IBNRouteGuideManager.NaviAddViewCallback() { @Override public View getAddedView() { return getBottomView(); } /** * @return sdk获取view高度进行元素避让,必须实现 * 导航中的控件不会随自定义view的高度变化而变化 */ @Override public int getViewHeight() { if (BNDemoOrderManager.getInstance(getActivity()) .getBnCarOrderInfo().size() > 1) { return ScreenUtil.getInstance().dip2px(60); } return ScreenUtil.getInstance().dip2px(50); } }) .addBottomViewCallback(new IBNRouteGuideManager.NaviAddViewCallback() { @Override public View getAddedView() { return getCustomView2(); } /** * @return sdk获取view高度进行元素避让,必须实现 */ @Override public int getViewHeight() { return ScreenUtil.getInstance().dip2px(40); } }) .build(); View view = BaiduNaviManagerFactory.getRouteGuideManager().onCreate(getActivity(), config);
2.横竖屏切换
为了防止在手机横竖屏切换过程中,导航出现布局混乱以及crash等情况,请在页面的onConfigurationChanged生命周期方法内调用专业导航的onConfigurationChanged接口。
@Override public void onConfigurationChanged(android.content.res.Configuration newConfig) { super.onConfigurationChanged(newConfig); BaiduNaviManagerFactory.getRouteGuideManager().onConfigurationChanged(newConfig); }
3.设置导航事件监听
/** * 设置导航事件监听 * @param callback */ void setNaviListener(IBNaviListener callback);
可监听的事件如下:
/** * 当前路名更新 * * @param name 当前道路名 */ public void onRoadNameUpdate(String name) { } /** * 距离目的地的剩余距离 * * @param remainDistance 剩余距离,单位米 * @param remainTime 剩余时间,单位秒 */ public void onRemainInfoUpdate(int remainDistance, int remainTime) { } /** * 途径点eta信息 * @param msg msg.arg1-剩余距离 msg.arg2-剩余时间 */ public void onViaListRemainInfoUpdate(Message msg) { } /** * 诱导信息 * * @param naviInfo 对应的诱导信息 */ public void onGuideInfoUpdate(BNaviInfo naviInfo) { } /** * 高速信息 * * @param action SHOW: 展示 HIDE: 消隐 UPDATE: 更新信息 * @param info 对应的高速信息 */ public void onHighWayInfoUpdate(Action action, BNHighwayInfo info) { } /** * 快速路出口信息 * * @param action SHOW: 展示 HIDE: 消隐 UPDATE: 更新信息 * @param name 快速路名称 * @param dist 离快速路出口的距离 * @param id 快速路ID */ public void onFastExitWayInfoUpdate(Action action, String name, int dist, String id) { } /** * 放大图回调接口 * * @param action 显示/刷新/隐藏动作 * @param enlargeMap 放大图View * @param remainDistance 剩余距离 * @param progress 路口的进度 * @param roadName 下一个路名 * @param turnIcon 转向标 */ public void onEnlargeMapUpdate(Action action, View enlargeMap, String remainDistance, int progress, String roadName, Bitmap turnIcon) { } /** * 日夜模式改变 * * @param style DayNightMode.DAY: 白天 DayNightMode.NIGHT: 黑夜 */ public void onDayNightChanged(DayNightMode style) { } /** * 路况信息更新 * * @param progress 车行驶的进度 单位为浮点类型,0-1为0%-100% * @param items 路况信息 */ public void onRoadConditionInfoUpdate(double progress, List<BNRoadCondition> items) { } /** * 主辅路、高架桥信息更新 * * @param type {@link BNaviCommonParams.BNMainSideBridge} */ public void onMainSideBridgeUpdate(int type) { } /** * 车道线信息更新 * * @param action Action.SHOW:显示 Action.HIDE:消隐 * @param laneItems 车道线数据 */ public void onLaneInfoUpdate(Action action, List<BNavLineItem> laneItems) { } /** * 速度信息 * 无数据返回 -1 * * @param speed 车速 km/h * @param speedLimit 限速 */ public void onSpeedUpdate(int speed, int speedLimit) { } /** * 超速回调 */ public void onOverSpeed(int speed, int speedLimit) { } /** * 到达目的地后回调函数 */ public void onArriveDestination() { } /** * 驾车路径导航到达某个途经点的回调函数 */ public void onArrivedWayPoint(int index) { } /** * 当GPS位置有更新时的回调函数 * 注:自v5.3.0.1版本之后,该接口返回的坐标系跟随初始化时设置的坐标系 */ public void onLocationChange(BNaviLocation naviLocation) { } /** * 底图操作态和导航态的回调 */ public void onMapStateChange(MapStateMode mapStateMode) { } /** * 开始偏航的回调 */ public void onStartYawing(String flag) { } /** * 偏航成功的回调 */ public void onYawingSuccess() { } /** * 导航到达途径点附近偏航之后途径点消失的回调 * * @param index 被删除途径点的索引 */ public void onYawingArriveViaPoint(int index) { } /** * 导航中通知型消息的回调 */ public void onNotificationShow(String msg) { } /** * 导航中前方一公里出现严重拥堵的回调 */ public void onHeavyTraffic() { } /** * 导航结束的回调 */ public void onNaviGuideEnd() { } /** * 卫星信号变化 */ public void onSatelliteNumUpdate(int num) { } /** * 偏好修改回调 * @param preferType 当前偏好 */ public void onPreferChanged(int preferType) { } /** * @param items 路线路况信息 * @param roadCondition 当前路段路况 */ public void onRoadConditionChange(List<BNaviRoadConditionItem> items , BNaviRoadConditionItem roadCondition) { }
4.设置导航视图监听
/** * 设置导航视图监听 * @param listener */ void setNaviViewListener(IBNaviViewListener listener);
可监听的事件如下:
/** * 诱导面板的点击事件 */ void onMainInfoPanCLick(); /** * 界面左上角转向操作的点击回调 */ void onNaviTurnClick(); /** * 全览按钮的点击回调 */ void onFullViewButtonClick(boolean show); /** * 全览小窗口的点击 */ void onFullViewWindowClick(boolean show); /** * 导航页面左下角退出按钮点击后的回调接口 */ void onNaviBackClick(); /** * 底部中间部分点击事件 */ void onBottomBarClick(Action action); /** * 底部右边更多设置按钮点击的回调接口 */ void onNaviSettingClick(); /** * 刷新按钮的回调接口 */ void onRefreshBtnClick(); /** * 地图缩放等级的回调 */ void onZoomLevelChange(int level); /** * 地图点击的回调(国测局GCJ02坐标) */ void onMapClicked(double x, double y); /** * 移动地图的回调 */ void onMapMoved(); /** * 后台诱导悬浮窗的点击 */ void onFloatViewClicked();
5.主辅路切换
/** * 返回主辅路桥上下类型 */ int getMainSideBridgeType(); /** * 切换主辅路/高架桥 * @param type {@link BNaviCommonParams.BNMainSideBridge} * @param listener 只会返回onSuccess/onFail */ void changeRouteByMainSideBridge(int type, ChangeRouteListener listener);
上面2个接口建议配合使用,返回的类型就表示当前可以切换的类型,如下示例
if (BaiduNaviManagerFactory.getRouteGuideManager().getMainSideBridgeType() == BNaviCommonParams.BNMainSideBridge.MAIN_ROAD) { BaiduNaviManagerFactory.getRouteGuideManager().changeRouteByMainSideBridge( BNaviCommonParams.BNMainSideBridge.MAIN_ROAD, new IBNRouteGuideManager.ChangeRouteListener() { @Override public void onSuccess() { } @Override public void onFail() { } }); }
6.修改终点重算路
/** * 导航中修改终点重新算路并导航 * @param newEndNode * @return */ boolean resetEndNodeInNavi(BNRoutePlanNode newEndNode);
7.添加途经点
途经点的添加数量可通过设置:BaiduNaviManagerFactory.getCommonSettingManager().setViaPointCount(10) 限制最大数量
/** * 添加途经点 */ void addViaNodes(List<BNRoutePlanNode> nodes);
可通过setViaPointCount来设置最大途径点的个数(支持4~18个),如下:
BaiduNaviManagerFactory.getCommonSettingManager().setViaPointCount(10)