Skip to content

Latest commit

 

History

History
619 lines (537 loc) · 17.6 KB

导航.md

File metadata and controls

619 lines (537 loc) · 17.6 KB

导航相关

导航初始化

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 初始化

内置 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 数据

// 开启使用外部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);