BaiduNaviManagerFactory.getBaiduNaviManager().init(context, mSDCardPath, APP_FOLDER_NAME,
new IBaiduNaviManager.INaviInitListener());
BNRoutePlanNode sNode = new BNRoutePlanNode.Builder()
.latitude(40.05087)
.longitude(116.30142)
.name("百度大厦")
.description("百度大厦")
.coordinateType(CoordinateType.GCJ02)
.build();
BNRoutePlanNode eNode = new BNRoutePlanNode.Builder()
.latitude(39.90882)
.longitude(116.39750)
.name("北京天安门")
.description("北京天安门")
.coordinateType(CoordinateType.GCJ02)
.build();
List<BNRoutePlanNode> list = new ArrayList<>();
list.add(sNode);
list.add(eNode);
BaiduNaviManagerFactory.getRoutePlanManager().routeplanToNavi(
list,
IBNRoutePlanManager.RoutePlanPreference.ROUTE_PLAN_PREFERENCE_DEFAULT,
null,
new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_START:
Toast.makeText(DemoMainActivity.this.getApplicationContext(),
"算路开始", Toast.LENGTH_SHORT).show();
break;
case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_SUCCESS:
Toast.makeText(DemoMainActivity.this.getApplicationContext(),
"算路成功", Toast.LENGTH_SHORT).show();
break;
case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_FAILED:
Toast.makeText(DemoMainActivity.this.getApplicationContext(),
"算路失败", Toast.LENGTH_SHORT).show();
break;
case IBNRoutePlanManager.MSG_NAVI_ROUTE_PLAN_TO_NAVI:
Toast.makeText(DemoMainActivity.this.getApplicationContext(),
"算路成功准备进入导航", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(DemoMainActivity.this,
DemoGuideActivity.class);
startActivity(intent);
break;
default:
// nothing
break;
}
}
});
内置 tts 初始化
BaiduNaviManagerFactory.getTTSManager().initTTS(context, mSDCardPath, APP_FOLDER_NAME, "tts appid");
外置tts初始化
BaiduNaviManagerFactory.getTTSManager().initTTS(mIBNOuterTTSPlayerCallback );
重载函数:
/**
* 获取百度专业导航过程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);
需要注意的是,为了防止横竖屏切换导致 crash,需要
@Override
public void onConfigurationChanged(android.content.res.Configuration newConfig) {
super.onConfigurationChanged(newConfig);
BaiduNaviManagerFactory.getRouteGuideManager().onConfigurationChanged(newConfig);
}
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);
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);
/**
* 导航中修改终点重新算路并导航
* @param newEndNode
* @return
*/
boolean resetEndNodeInNavi(BNRoutePlanNode newEndNode);
/**
* 添加途经点
*/
void addViaNodes(List<BNRoutePlanNode> nodes);
可以分为普通导航和专业导航
普通导航IBNOuterSettingManager.IBNCommonSetting中可设置的接口如下:
interface IBNCommonSetting {
/**
* 设置是否开启多路线
*
* @param isMultiRoute 为true开启多路线,false关闭多路线
*/
void setMultiRouteEnable(boolean isMultiRoute);
/**
* 获取是否开启了多路线
*
* @return
*/
boolean isMultiRouteEnable();
/**
* 定制化起点、终点、当前位置icon
*
* @param pngBitmap
* @param imageType 类型:
* {@linkplain DIYImageType#CarLogo} 车标
* {@linkplain DIYImageType#StartPoint} 路线起点
* {@linkplain DIYImageType#EndPoint} 路线终点
*
* @return
*/
boolean setDIYImageToMap(Bitmap pngBitmap, int imageType);
/**
* 清除定制icon
*
* @param imageType 类型:
* {@linkplain DIYImageType#CarLogo} 车标
* {@linkplain DIYImageType#StartPoint} 路线起点
* {@linkplain DIYImageType#EndPoint} 路线终点
*
* @return
*/
boolean clearDIYImage(int imageType);
/**
* 设置起点、终点、当前位置显示状态
*
* @param status
* @param imageType 类型:
* {@linkplain DIYImageType#CarLogo} 车标
* {@linkplain DIYImageType#StartPoint} 路线起点
* {@linkplain DIYImageType#EndPoint} 路线终点
*
* @return
*/
boolean setDIYImageStatus(boolean status, int imageType);
/**
* 设置算路偏好
*
* @param mode 算路偏好类型:
* {@linkplcain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_INVALID} 无效值
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_DEFAULT} 默认,智能推荐
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_NOHIGHWAY} 不走高速
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_NOTOLL} 少收费
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_AVOID_TRAFFIC_JAM} 躲避拥堵
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_CAR_NUM} 使用车牌
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_DISTANCE_FIRST} 距离最短,距离优先
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_TIME_FIRST} 时间最短,时间优先
* {@linkplain NeRoutePlanPreference#ROUTE_PLAN_PREFERENCE_ROAD_FIRST} 大路优先,高速优先
*
* @return
*/
boolean setRouteSortMode(int mode);
/**
* 获取当前算路偏好
*
* @return
*/
int getRouteSortMode();
/**
* 设置车牌
*
* @param context 上下文
* @param carNum 完整车牌,如:"粤B66666"
*
* @return
*/
boolean setCarNum(Context context, String carNum);
/**
* 停止百度导航对系统的定位监听
*/
void stopLocationMonitor();
}
专业导航接口设置:
interface IBNProfessionalNaviSetting {
/**
* 设置专业导航视角
*
* @param mode 视角类型:
* {@linkplain NaviPerspectiveMode#CAR_3D} 跟随车头模式
* {@linkplain NaviPerspectiveMode#NORTH_2D} 正北朝上模式
*/
void setGuideViewMode(int mode);
/**
* 获取当前专业导航视角类型
*
* @return
*/
int getGuideViewMode();
/**
* 设置专业导航日夜模式
*
* @param mode 日夜模式:
* {@linkplain DayNightMode#DAY_NIGHT_MODE_AUTO} 自动切换白天黑夜模式
* {@linkplain DayNightMode#DAY_NIGHT_MODE_DAY} 日间模式
* {@linkplain DayNightMode#DAY_NIGHT_MODE_NIGHT} 夜间模式
*/
void setDayNightMode(int mode);
/**
* 获取当前设置的日夜模式类型
*
* @return
*/
int getDayNightMode();
/**
* 设置专业导航右下角图面显示类型
*
* @param mode 显示类型:
* {@linkplain PreViewMode#MapMini} 全览小窗
* {@linkplain PreViewMode#RoadBar} 路况条
* {@linkplain PreViewMode#NoAll} 不显示
*/
void setFullViewMode(int mode);
/**
* 获取专业导航右下角图面显示类型
*
* @return
*/
int getFullViewMode();
/**
* 设置专业导航比例尺是否智能缩放
*
* @param isAutoScale 为true则设置智能缩放,false不设置
*/
void setAutoScale(boolean isAutoScale);
/**
* 获取当前是否设置专业导航比例尺智能缩放
*
* @return
*/
boolean isAutoScale();
/**
* 设置专业导航是否显示车标到终点红色连线
*
* @param showCarLogoToEndRedLine 为true则设置连线,false不设置
*/
void setShowCarLogoToEndRedLine(boolean showCarLogoToEndRedLine);
/**
* 获取当前是否设置车标到终点红色连线
*
* @return
*/
boolean isShowCarLogoToEndRedLine();
/**
* 设置专业导航是否显示路口放大图
*
* @param showRoadEnlargeView 为true则设置显示放大图,false不设置
*/
void setShowRoadEnlargeView(boolean showRoadEnlargeView);
/**
* 获取当前是否显示路口放大图
*
* @return
*/
boolean isShowRoadEnlargeView();
/**
* 设置到达目的地时,导航是否自动退出
*/
void setIsAutoQuitWhenArrived(boolean auto);
/**
* 获取实时路况是否开启
*/
boolean isRealRoadConditionOpen();
/**
* 设置实时路况是否开启
* @param open
*/
void setRealRoadCondition(boolean open);
/**
* 设置播报模式
* @param voiceMode
*/
void setVoiceMode(int voiceMode);
/**
* 设置是否显示主辅路和高架桥按钮
* @param show
*/
void setShowMainAuxiliaryOrBridge(boolean show);
/**
* 设置导航底图车标偏移,仅针对专业导航Car3D竖屏模式有效,,底图中心为(0, 0)原点
*
* @param xOffset 导航底图车标x偏移量,> 0时往右偏移,单位:像素
* @param yOffset 导航底图车标y偏移量,< 0时往下偏移,单位:像素
*/
void setCarIconOffsetForNavi(int xOffset, int yOffset);
/**
* 设置专业导航全览时路线距离屏幕边距
*
* @param left 左边距,路线全览左侧边距,单位px
* @param top 上边距,路线全览上侧边距,单位px
* @param right 右边距,路线全览右侧边距,单位px
* @param bottom 下边距,路线全览下侧边距,单位px
*/
void setFullViewMarginSize(final int left, final int top, final int right, final int bottom);
/**
* 路线偏好功能入口是否开放
* 注意:进专业导航之前设置生效,且是单次生效
*/
void enableRouteSort(boolean enable);
/**
* 沿途检索功能入口是否开放
* 注意:进专业导航之前设置生效,且是单次生效
*/
void enableRouteSearch(boolean enable);
/**
* 底部bar是否支持展开
* @param enable
*/
void enableBottomBarOpen(boolean enable);
/**
* 更多设置功能入口是否开放
* 注意:进专业导航之前设置生效,且是单次生效
*/
void enableMoreSettings(boolean enable);
/**
* 设置进导航时是否全览,默认为不全览
* 该全览只是5s全览,随后会进入导航态
* @param fullView true 全览
*/
void setStartByFullView(boolean fullView);
/**
* 偏航提示音开关
*/
void setYawSoundEnable(boolean enable);
}
Bundle bundle = new Bundle();
// IS_REALNAVI代表导航类型,true表示真实导航,false表示模拟导航,默认是true
bundle.putBoolean(BNaviCommonParams.ProGuideKey.IS_REALNAVI, false);
BaiduNaviManagerFactory.getRouteGuideManager().onCreate(this, mOnNavigationListener, null, bundle);
// 开启使用外部GPS数据
BaiduNaviManagerFactory.getBaiduNaviManager().externalLocation(true);
// 传入外部GPS数据,请尽量按以下方式传入数据参数,缺失数据会影响GPS的准确性,造成定位不准。
// 必须使用WGS84坐标系
BNLocationData mLocData = new BNLocationData.Builder()
.latitude(location.getLatitude())
.longitude(location.getLongitude())
.accuracy(location.getAccuracy())
.speed(location.getSpeed())
.direction(location.getBearing())
.altitude((int) location.getAltitude())
.time(location.getTime())
.build();
BaiduNaviManagerFactory.getMapManager().setMyLocationData(mLocData);