五度液、android百度地圖之導(dǎo)航(代碼的拆分和工具類的封裝)

導(dǎo)航

四湾碎、android百度地圖之導(dǎo)航(環(huán)境的配置)
五宙攻、android百度地圖之導(dǎo)航(代碼的拆分和工具類的封裝)

通過前面對(duì)導(dǎo)航的環(huán)境配置,我們現(xiàn)在完成整個(gè)導(dǎo)航功能中最為關(guān)鍵的一步介褥,那就是對(duì)導(dǎo)航代碼進(jìn)行拆分以及封裝座掘。

一、導(dǎo)航工具類的封裝

通過我做導(dǎo)航這個(gè)功能柔滔,覺得最難的部分就是對(duì)導(dǎo)航工具類的封裝溢陪,里面的邏輯和各個(gè)類、各個(gè)方法甚至于各個(gè)參數(shù)睛廊,在百度文檔里都沒有明確的寫出來形真,都是我直接看API一個(gè)一個(gè)分析和拆分的,所以我直接將代碼放出來超全,注釋很詳細(xì)就不用我多說了咆霜,代碼如下:

/**
 * @title  百度導(dǎo)航工具類
 * @date   2017/11/20
 * @author 貓兒不吃魚魚
 */
public class NavigationUtil implements BaiduNaviManager.NavEventListener{

    private Activity activity;

    /**
     * 系統(tǒng)SD卡根目錄路徑
     */
    private String mSDCardPath;

    /**
     * 應(yīng)用在SD卡中的目錄名
     */
    private String appFolderName;

    /**
     * 標(biāo)識(shí)初始化是否成功
     */
    private boolean hasInitSuccess = false;

    /**
     * 校驗(yàn)信息
     */
    private String authinfo;

    /**
     * 路節(jié)點(diǎn)的坐標(biāo)類型
     * BD09_MC
     * 百度墨卡托坐標(biāo)
     * BD09LL
     * 百度經(jīng)緯度坐標(biāo)
     * GCJ02
     * 國測局坐標(biāo)
     * WGS84
     * GPS坐標(biāo)
     */
    private BNRoutePlanNode.CoordinateType mCoordinateType = null;

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

    /**
     * 百度導(dǎo)航服務(wù)授權(quán)和引擎初始化
     */
    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校驗(yàn)成功!";
                } else {
                    authinfo = "key校驗(yàn)失敗, " + msg;
                }
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(activity, authinfo, Toast.LENGTH_LONG).show();
                    }
                });
            }

            @Override
            public void initStart() {
                Toast.makeText(activity, "百度導(dǎo)航引擎初始化開始", Toast.LENGTH_SHORT).show();
            }

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

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

    /**
     * 異步獲取百度內(nèi)部TTS播報(bào)狀態(tài)
     */
    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;
            }
        }
    };

    /**
     * 導(dǎo)航設(shè)置
     */
    private void initSetting() {
        //顯示路況條 預(yù)覽條顯示
        BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON);
        // 導(dǎo)航中語音播報(bào)模式 老手模式
        BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran);
        // 實(shí)際道路條件 路況條 開
        BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON);
        //到達(dá)時(shí)自動(dòng)退出
        BNaviSettingManager.setIsAutoQuitWhenArrived(true);
        //創(chuàng)建Bundle
        Bundle bundle = new Bundle();
        //必須設(shè)置APPID,否則會(huì)靜音嘶朱,這里的id傳入你們自己申請(qǐng)的id
        bundle.putString(BNCommonSettingParam.TTS_APP_ID, id);
        //設(shè)置語音播報(bào)
        BNaviSettingManager.setNaviSdkParam(bundle);
    }

    /**
     * 路線規(guī)劃導(dǎo)航
     * @param coType
     * @param longitudeStarting 起點(diǎn)經(jīng)度
     * @param latitudeStarting 起點(diǎn)維度
     * @param longitudeEnd 終點(diǎn)經(jīng)度
     * @param latitudeEnd 終點(diǎn)維度
     * @param startingName 起點(diǎn)名字
     * @param endName 終點(diǎn)名字
     */
    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);

            // 開發(fā)者可以使用舊的算路接口蛾坯,也可以使用新的算路接口,可以接收誘導(dǎo)信息等
            // 第四個(gè)參數(shù)如果為false則是模擬導(dǎo)航
            // BaiduNaviManager.getInstance().launchNavigator(this, list, 1, true, new DemoRoutePlanListener(sNode));
            BaiduNaviManager.getInstance().launchNavigator(activity, list, 1, true, new NavigationRoutePlanListener(sNode,activity), this);
        }
    }

    /**
     * 導(dǎo)航過程信息回調(diào)接口
     * @param what
     * @param arg1
     * @param arg2
     * @param bundle
     */
    @Override
    public void onCommonEventCall(int what, int arg1, int arg2, Bundle bundle) {
    }

}

二、路線方案的監(jiān)聽(算路節(jié)點(diǎn))

在完成了導(dǎo)航的工具類后疏遏,大家的思路肯定會(huì)想到從起點(diǎn)到終點(diǎn)怎么去規(guī)劃這個(gè)路線脉课,所以我們現(xiàn)在還需要一個(gè)對(duì)路線的監(jiān)聽和計(jì)算的類,依舊詳細(xì)财异,代碼如下:

/**
 * @title  路線方案的監(jiān)聽
 * @date   2017/11/20
 * @author 貓兒不吃魚魚
 */
public class NavigationRoutePlanListener implements BaiduNaviManager.RoutePlanListener {

    private Activity activity;

    /**
     * 路線方案的節(jié)點(diǎn)
     */
    public static final String ROUTE_PLAN_NODE = "routePlanNode";

    /**
     * 算路節(jié)點(diǎn)
     */
    private BNRoutePlanNode mBNRoutePlanNode = null;

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

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

    /**
     * 導(dǎo)航初始化監(jiān)聽器
     * 路線規(guī)劃成功倘零,需要跳轉(zhuǎn)到導(dǎo)航過程頁面
     */
    @Override
    public void onJumpToNavigator() {

        /**
         * 設(shè)置途徑點(diǎn)以及resetEndNode會(huì)回調(diào)該接口
         */
        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);
    }
    /**
     * 導(dǎo)航初始化監(jiān)聽器
     * 路線規(guī)劃失敗
     */
    @Override
    public void onRoutePlanFailed() {
        // TODO Auto-generated method stub
        Toast.makeText(activity, "算路失敗", Toast.LENGTH_SHORT).show();
    }
}

三、導(dǎo)航需要的一些常量

/**
 * @title  導(dǎo)航路徑引導(dǎo)模塊常量
 * @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播報(bào)狀態(tài)

看到這里大家就要納悶了呈驶,在NavigationUtil類里明明有一個(gè)ttsHandler的TTS播報(bào)狀態(tài),為什么這里還會(huì)提到疫鹊。其實(shí)我和你們是一樣一樣的俐东,他這個(gè)同步和異步不知道怎么搞的跌穗,必須兩個(gè)一起寫才有效果,我翻遍了API也沒找到合理的解答虏辫,所以為了我們的導(dǎo)航能正常運(yùn)行還是寫一下蚌吸,代碼很簡單,防止小白我仍然貼出來:

/**
 * @title  同步獲取百度內(nèi)部TTS播報(bào)狀態(tài)回調(diào)接口
 * @date   2017/11/20
 * @author 貓兒不吃魚魚
 */
public class TTSListener implements BaiduNaviManager.TTSPlayStateListener{

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

    }

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

    }
}

到此為止砌庄,整個(gè)導(dǎo)航功能已經(jīng)走完三分之二的路程了羹唠,為了方便大家我歷來都是直接貼出代碼,因?yàn)榭匆娨粋€(gè)教程卻不能完成功能的感覺簡直不能太糟糕娄昆。本來這一篇可以繼續(xù)寫完的佩微,但是為了防止篇幅過長和大家只復(fù)制粘貼不搞明白思路我就留著下一篇再講。喜歡就點(diǎn)個(gè)贊唄~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末萌焰,一起剝皮案震驚了整個(gè)濱河市哺眯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌扒俯,老刑警劉巖奶卓,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異撼玄,居然都是意外死亡夺姑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門掌猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盏浙,“玉大人,你說我怎么就攤上這事荔茬》媳欤” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵慕蔚,是天一觀的道長丐黄。 經(jīng)常有香客問我,道長坊萝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任许起,我火速辦了婚禮十偶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘园细。我一直安慰自己惦积,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布猛频。 她就那樣靜靜地躺著狮崩,像睡著了一般蛛勉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上睦柴,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天诽凌,我揣著相機(jī)與錄音,去河邊找鬼坦敌。 笑死侣诵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狱窘。 我是一名探鬼主播杜顺,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼蘸炸!你這毒婦竟也來了躬络?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤搭儒,失蹤者是張志新(化名)和其女友劉穎穷当,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗嗦,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膘滨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稀拐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片火邓。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖德撬,靈堂內(nèi)的尸體忽然破棺而出铲咨,到底是詐尸還是另有隱情,我是刑警寧澤蜓洪,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布纤勒,位于F島的核電站,受9級(jí)特大地震影響隆檀,放射性物質(zhì)發(fā)生泄漏摇天。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一恐仑、第九天 我趴在偏房一處隱蔽的房頂上張望泉坐。 院中可真熱鬧,春花似錦裳仆、人聲如沸腕让。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯丸。三九已至偏形,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間觉鼻,已是汗流浹背俊扭。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留滑凉,地道東北人统扳。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像畅姊,于是被迫代替她去往敵國和親咒钟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫若未、插件朱嘴、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,094評(píng)論 4 62
  • 1天/篇鈞鈺反思日志0815-2017@真誠的文字 現(xiàn)階段4個(gè)需重點(diǎn)達(dá)成的事項(xiàng) 早睡早起——晚不超過22:30,早...
    鈞鈺閱讀 285評(píng)論 0 0