路线规划成功后,就可以使用专业导航服务,专业导航服务依赖App的页面生命周期,开发时,只需要将百度导航SDK专业导航生命周期接口挂接到对应页面的生命周期接口即可,App页面既可以是Activity,也可以是Fragment等。
1生命周期
/** * 获取百度专业导航过程View对象,将其加入应用布局内即可显示导航过程. * * @param activity 应用导航过程所属Activity对象 * @param listener 导航过程监听器,主要是监听导航过程中消息分发,比如到达终点、导航结束和更新路名等 * * @return */ View onCreate(final Activity activity, final OnNavigationListener listener); /** * 百度专业导航生命周期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相对重要的方法介绍,更多参数和方法请您关注[参考手册]
1.专业导航onCreate方法
专业导航onCreate方法一共有4个重载方法,分别如下
/** * 获取百度专业导航过程View对象,将其加入应用布局内即可显示导航过程. * * @param activity 应用导航过程所属Activity对象 * @param listener 导航过程监听器,主要是监听导航过程中消息分发,比如到达终点、导航结束和更新路名等 * * @return */ View onCreate(final Activity activity, final OnNavigationListener listener); /** * @param callback 添加自定义View到导航中的callback对象 * @return */ View onCreate(final Activity activity, final OnNavigationListener listener, final NaviAddViewCallback callback); /** * @param params 定制化导航参数 * @return */ View onCreate(final Activity activity, final OnNavigationListener listener, final Bundle params); /** * @param params 定制化导航参数 * * @return */ View onCreate(final Activity activity, final OnNavigationListener listener, final NaviAddViewCallback callback, final Bundle params);
其中带NaviAddViewCallback的重载方法表示可以在专业导航界面添加自定义view,带Bundle的重载方法可以传入一些参数来自定义导航。具体可传入的参数如下:
Bundle bundle = new Bundle(); // IS_REALNAVI代表导航类型,true表示真实导航,false表示模拟导航,默认是true bundle.putBoolean(BNaviCommonParams.ProGuideKey.IS_REALNAVI, true); // IS_SUPPORT_FULL_SCREEN代表是否沉浸式,默认是true bundle.putBoolean(BNaviCommonParams.ProGuideKey.IS_SUPPORT_FULL_SCREEN, true); BaiduNaviManagerFactory.getRouteGuideManager().onCreate(this, mOnNavigationListener, null, bundle);
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 当前道路名 */ void onRoadNameUpdate(String name); /** * 距离目的地的剩余距离 * * @param remainDistance 剩余距离,单位米 * @param remainTime 剩余时间,单位秒 */ void onRemainInfoUpdate(int remainDistance, int remainTime); /** * 诱导信息 * * @param naviInfo 对应的诱导信息 */ void onGuideInfoUpdate(BNaviInfo naviInfo); /** * 高速信息 * * @param action SHOW: 展示 HIDE: 消隐 UPDATE: 更新信息 * @param info 对应的高速信息 */ void onHighWayInfoUpdate(Action action, BNHighwayInfo info); /** * 快速路出口信息 * * @param action SHOW: 展示 HIDE: 消隐 UPDATE: 更新信息 * @param name 快速路名称 * @param dist 离快速路出口的距离 * @param id 快速路ID */ void onFastExitWayInfoUpdate(BNEventManager.Action action, String name, int dist, String id); /** * 放大图回调接口 * * @param action 显示/刷新/隐藏动作 * @param enlargeMap 放大图View * @param remainDistance 剩余距离 * @param progress 路口的进度 * @param roadName 下一个路名 * @param turnIcon 转向标 */ void onEnlargeMapUpdate(BNEventManager.Action action, View enlargeMap, String remainDistance, int progress, String roadName, Bitmap turnIcon); /** * 日夜模式改变 * * @param style DayNightMode.DAY: 白天 DayNightMode.NIGHT: 黑夜 */ void onDayNightChanged(DayNightMode style); /** * 路况信息更新 * * @param progress 车行驶的进度 单位为浮点类型,0-1为0%-100% * @param items 路况信息 */ void onRoadConditionInfoUpdate(double progress, List<BNRoadCondition> items); /** * 主辅路、高架桥信息更新 * * @param type {@link com.baidu.navisdk.adapter.BNaviCommonParams.BNMainSideBridge} */ void onMainSideBridgeUpdate(int type); /** * 车道线信息更新 * * @param action Action.SHOW:显示 Action.HIDE:消隐 * @param laneItems 车道线数据 */ void onLaneInfoUpdate(BNEventManager.Action action, List<RGLineItem> laneItems); /** * 速度信息 * * @param speed 车速 "--" 代表速度不可信,其他String返回值为数字 km/h * @param isOverSpeed 是否超速 */ void onSpeedUpdate(String speed, boolean isOverSpeed); /** * 到达目的地后回调函数 */ void onArriveDestination(); /** * 驾车路径导航到达某个途经点的回调函数 */ void onArrivedWayPoint(int index);
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); /** * 界面右下角功能设置按钮的回调接口 * * @param isOpen 设置界面是否打开 */ void onNaviSetting(boolean isOpen);
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.添加途经点
途经点的添加不得多于3个
/** * 添加途经点 */ void addViaNodes(List<BNRoutePlanNode> nodes);