五、android百度地图之导航(代码的拆分和工具类的封装)

导航

四、android百度地图之导航(环境的配置)
五、android百度地图之导航(代码的拆分和工具类的封装)

通过前面对导航的环境配置,我们现在完成整个导航功能中最为关键的一步,那就是对导航代码进行拆分以及封装。

一、导航工具类的封装

通过我做导航这个功能,觉得最难的部分就是对导航工具类的封装,里面的逻辑和各个类、各个方法甚至于各个参数,在百度文档里都没有明确的写出来,都是我直接看API一个一个分析和拆分的,所以我直接将代码放出来,注释很详细就不用我多说了,代码如下:

/**
 * @title  百度导航工具类
 * @date   2017/11/20
 * @author 猫儿不吃鱼鱼
 */
public class NavigationUtil implements BaiduNaviManager.NavEventListener{

    private Activity activity;

    /**
     * 系统SD卡根目录路径
     */
    private String mSDCardPath;

    /**
     * 应用在SD卡中的目录名
     */
    private String appFolderName;

    /**
     * 标识初始化是否成功
     */
    private boolean hasInitSuccess = false;

    /**
     * 校验信息
     */
    private String authinfo;

    /**
     * 路节点的坐标类型
     * BD09_MC
     * 百度墨卡托坐标
     * BD09LL
     * 百度经纬度坐标
     * GCJ02
     * 国测局坐标
     * WGS84
     * GPS坐标
     */
    private BNRoutePlanNode.CoordinateType mCoordinateType = null;

    public NavigationUtil(Activity activity, String mSDCardPath, String appFolderName) {
        this.activity = activity;
        this.mSDCardPath = mSDCardPath;
        this.appFolderName = appFolderName;
    }

    /**
     * 百度导航服务授权和引擎初始化
     */
    public void initNavi() {

        BaiduNaviManager.getInstance().init(activity, mSDCardPath, appFolderName, new BaiduNaviManager.NaviInitListener() {
            @Override
            public void onAuthResult(int status, String msg) {
                if (0 == status) {
                    authinfo = "key校验成功!";
                } else {
                    authinfo = "key校验失败, " + msg;
                }
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(activity, authinfo, Toast.LENGTH_LONG).show();
                    }
                });
            }

            @Override
            public void initStart() {
                Toast.makeText(activity, "百度导航引擎初始化开始", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void initSuccess() {
                Toast.makeText(activity, "百度导航引擎初始化成功", Toast.LENGTH_SHORT).show();
                hasInitSuccess = true;
                initSetting();
            }

            @Override
            public void initFailed() {
                Toast.makeText(activity, "百度导航引擎初始化失败", Toast.LENGTH_SHORT).show();
            }
        }, null, ttsHandler, new TTSListener());
    }

    /**
     * 异步获取百度内部TTS播报状态
     */
    private Handler ttsHandler = new Handler() {
        public void handleMessage(Message msg) {
            int type = msg.what;
            switch (type) {
                case BaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG:
                    //Handler : TTS play start...
                    break;
                case BaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG:
                    //Handler : TTS play end...
                    break;
            }
        }
    };

    /**
     * 导航设置
     */
    private void initSetting() {
        //显示路况条 预览条显示
        BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON);
        // 导航中语音播报模式 老手模式
        BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran);
        // 实际道路条件 路况条 开
        BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON);
        //到达时自动退出
        BNaviSettingManager.setIsAutoQuitWhenArrived(true);
        //创建Bundle
        Bundle bundle = new Bundle();
        //必须设置APPID,否则会静音,这里的id传入你们自己申请的id
        bundle.putString(BNCommonSettingParam.TTS_APP_ID, id);
        //设置语音播报
        BNaviSettingManager.setNaviSdkParam(bundle);
    }

    /**
     * 路线规划导航
     * @param coType
     * @param longitudeStarting 起点经度
     * @param latitudeStarting 起点维度
     * @param longitudeEnd 终点经度
     * @param latitudeEnd 终点维度
     * @param startingName 起点名字
     * @param endName 终点名字
     */
    public void routePlanToNavi(BNRoutePlanNode.CoordinateType coType, double longitudeStarting, double latitudeStarting,
                                double longitudeEnd, double latitudeEnd, String startingName, String endName) {
        mCoordinateType = coType;
        if (!hasInitSuccess) {
            Toast.makeText(activity, "还未初始化!", Toast.LENGTH_SHORT).show();
        }

        BNRoutePlanNode sNode = null;
        BNRoutePlanNode eNode = null;
        switch (coType) {
            case GCJ02:
                sNode = new BNRoutePlanNode(longitudeStarting, latitudeStarting, startingName, null, coType);
                eNode = new BNRoutePlanNode(longitudeEnd, latitudeEnd, endName, null, coType);
                break;
            case WGS84:
                sNode = new BNRoutePlanNode(longitudeStarting, latitudeStarting, startingName, null, coType);
                eNode = new BNRoutePlanNode(longitudeEnd, latitudeEnd, endName, null, coType);
                break;
            case BD09_MC:
                sNode = new BNRoutePlanNode(longitudeStarting, latitudeStarting, startingName, null, coType);
                eNode = new BNRoutePlanNode(longitudeEnd, latitudeEnd, endName, null, coType);
                break;
            case BD09LL:
                sNode = new BNRoutePlanNode(longitudeStarting, latitudeStarting, startingName, null, coType);
                eNode = new BNRoutePlanNode(longitudeEnd, latitudeEnd, endName, null, coType);
                break;
        }
        if (sNode != null && eNode != null) {
            List<BNRoutePlanNode> list = new ArrayList();
            list.add(sNode);
            list.add(eNode);

            // 开发者可以使用旧的算路接口,也可以使用新的算路接口,可以接收诱导信息等
            // 第四个参数如果为false则是模拟导航
            // BaiduNaviManager.getInstance().launchNavigator(this, list, 1, true, new DemoRoutePlanListener(sNode));
            BaiduNaviManager.getInstance().launchNavigator(activity, list, 1, true, new NavigationRoutePlanListener(sNode,activity), this);
        }
    }

    /**
     * 导航过程信息回调接口
     * @param what
     * @param arg1
     * @param arg2
     * @param bundle
     */
    @Override
    public void onCommonEventCall(int what, int arg1, int arg2, Bundle bundle) {
    }

}

二、路线方案的监听(算路节点)

在完成了导航的工具类后,大家的思路肯定会想到从起点到终点怎么去规划这个路线,所以我们现在还需要一个对路线的监听和计算的类,依旧详细,代码如下:

/**
 * @title  路线方案的监听
 * @date   2017/11/20
 * @author 猫儿不吃鱼鱼
 */
public class NavigationRoutePlanListener implements BaiduNaviManager.RoutePlanListener {

    private Activity activity;

    /**
     * 路线方案的节点
     */
    public static final String ROUTE_PLAN_NODE = "routePlanNode";

    /**
     * 算路节点
     */
    private BNRoutePlanNode mBNRoutePlanNode = null;

    public static List<Activity> activityList = new LinkedList();

    public NavigationRoutePlanListener(BNRoutePlanNode node,Activity activity) {
        this.activity = activity;
        mBNRoutePlanNode = node;
    }

    /**
     * 导航初始化监听器
     * 路线规划成功,需要跳转到导航过程页面
     */
    @Override
    public void onJumpToNavigator() {

        /**
         * 设置途径点以及resetEndNode会回调该接口
         */
        for (Activity ac : activityList) {
            if (ac.getClass().getName().endsWith("NavigationGuideActivity")) {
                return;
            }
        }
        Intent intent = new Intent(activity, NavigationGuideActivity.class);
        Bundle bundle = new Bundle();
        bundle.putSerializable(ROUTE_PLAN_NODE, (BNRoutePlanNode) mBNRoutePlanNode);
        intent.putExtras(bundle);
        activity.startActivity(intent);
    }
    /**
     * 导航初始化监听器
     * 路线规划失败
     */
    @Override
    public void onRoutePlanFailed() {
        // TODO Auto-generated method stub
        Toast.makeText(activity, "算路失败", Toast.LENGTH_SHORT).show();
    }
}

三、导航需要的一些常量

/**
 * @title  导航路径引导模块常量
 * @date   2017/11/20
 * @author 猫儿不吃鱼鱼
 */
public interface NavigationRouteGuideModuleConstants {

    int METHOD_TYPE_ON_KEY_DOWN = 0x01;

    String KEY_TYPE_KEYCODE = "keyCode";

    String KEY_TYPE_EVENT = "event";

}

四、TTS播报状态

看到这里大家就要纳闷了,在NavigationUtil类里明明有一个ttsHandler的TTS播报状态,为什么这里还会提到。其实我和你们是一样一样的,他这个同步和异步不知道怎么搞的,必须两个一起写才有效果,我翻遍了API也没找到合理的解答,所以为了我们的导航能正常运行还是写一下,代码很简单,防止小白我仍然贴出来:

/**
 * @title  同步获取百度内部TTS播报状态回调接口
 * @date   2017/11/20
 * @author 猫儿不吃鱼鱼
 */
public class TTSListener implements BaiduNaviManager.TTSPlayStateListener{

    /**
     * TTS开始
     */
    @Override
    public void playStart() {

    }

    /**
     * TTS停止
     */
    @Override
    public void playEnd() {

    }
}

到此为止,整个导航功能已经走完三分之二的路程了,为了方便大家我历来都是直接贴出代码,因为看见一个教程却不能完成功能的感觉简直不能太糟糕。本来这一篇可以继续写完的,但是为了防止篇幅过长和大家只复制粘贴不搞明白思路我就留着下一篇再讲。喜欢就点个赞呗~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容