《基于Android的手機(jī)地圖APP》_第1頁(yè)
《基于Android的手機(jī)地圖APP》_第2頁(yè)
《基于Android的手機(jī)地圖APP》_第3頁(yè)
《基于Android的手機(jī)地圖APP》_第4頁(yè)
《基于Android的手機(jī)地圖APP》_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

JISHOUUNIVERSITY本科生畢業(yè)設(shè)計(jì)題目:基于Android系統(tǒng)的手機(jī)地圖APP學(xué)號(hào):201520078所屬學(xué)院:信息科學(xué)與工程學(xué)院 專業(yè)年級(jí):電子信息工程技術(shù),2013級(jí) 指導(dǎo)教師:侯冬晴職稱:副教授 吉首大學(xué)教務(wù)處制 IAbstract II 11.1課題研究的背景和目的 11.2國(guó)內(nèi)外研究現(xiàn)狀 11.3研究?jī)?nèi)容和設(shè)計(jì)結(jié)構(gòu) 3第2章課題設(shè)計(jì)相關(guān)技術(shù)概述 42.1開(kāi)發(fā)語(yǔ)言 42.2Android的架構(gòu) 42.3AndroidSDK 5第3章軟件需求性分析 63.1可行性 63.2需求分析 73.3業(yè)務(wù)流程 7第4章百度Key(密鑰)申請(qǐng) 94.1申請(qǐng)百度密鑰 94.2將Key添加到manifests文件application當(dāng)中 12第5章系統(tǒng)設(shè)計(jì) 135.1系統(tǒng)功能結(jié)構(gòu) 135.2聲明軟件應(yīng)用權(quán)限 135.3基本配置 14第6章系統(tǒng)實(shí)現(xiàn) 166.1系統(tǒng)運(yùn)行環(huán)境和開(kāi)發(fā)平臺(tái) 166.2系統(tǒng)開(kāi)機(jī)閃屏頁(yè)面 176.3地圖主界面 186.4實(shí)時(shí)路況界面 226.5視圖界面 236.6搜索界面 256.7導(dǎo)航界面 29第7章地圖上線 367.1預(yù)期測(cè)試結(jié)果 367.2實(shí)際測(cè)試結(jié)果 36結(jié)束語(yǔ) 38參考文獻(xiàn) 39 40基于Android系統(tǒng)的手機(jī)地圖APPAndroidSDK是一套基于Android2.1及以上版本的移動(dòng)設(shè)備應(yīng)用接口。在手機(jī)地圖領(lǐng)域做得最好的就當(dāng)數(shù)谷歌地圖和百度地圖了,并且這兩種地圖都提供了豐富的API[1],使得任何開(kāi)發(fā)者都可以輕松地將地圖功能引入到自己的應(yīng)用程序當(dāng)中。通過(guò)調(diào)用地圖SDK接口可以輕松訪問(wèn)在手機(jī)上訪問(wèn)百度地圖服務(wù)和數(shù)據(jù),可以構(gòu)建功能豐富、并且交互性強(qiáng)的手機(jī)移動(dòng)地圖應(yīng)用程序。UI設(shè)計(jì)方面借鑒了百度簡(jiǎn)約的設(shè)計(jì)風(fēng)格,簡(jiǎn)單明了又不失獨(dú)特。Java開(kāi)發(fā)語(yǔ)言和最新的AndroidStudio開(kāi)發(fā)軟件為本應(yīng)用提供了穩(wěn)定環(huán)境及開(kāi)發(fā)平臺(tái),通過(guò)設(shè)計(jì)本應(yīng)用可以提供地圖展示(城市熱力圖、衛(wèi)星地圖、城市實(shí)時(shí)路況信息圖)地圖定位和地圖操作功能,支持城市內(nèi)POI檢索并進(jìn)行Place詳情列表展示,根據(jù)POI檢索結(jié)果和長(zhǎng)按地圖設(shè)置目的地的操作會(huì)進(jìn)行覆蓋物標(biāo)注從而展示更加豐富的地圖。目前還可以支持百度地圖的調(diào)啟功能包括(駕車(chē)導(dǎo)航和騎行導(dǎo)航根據(jù)導(dǎo)航又可以分成模擬導(dǎo)航和實(shí)時(shí)導(dǎo)航兩部分。其中模擬導(dǎo)航作為創(chuàng)新點(diǎn)則間接具備了提前查看實(shí)時(shí)行駛交通,查看線路規(guī)劃的功能從而提高導(dǎo)航效率。關(guān)鍵詞:地圖導(dǎo)航;百度地圖;Java;AndroidSDKMobilephonemapbasedonAndroidsystemAbstractThisdesignisamobilemapapplicationforAndroidsystem,whichcallstheBaidumapAndroidSDK,itisasetofAndroid2.1andaboveversionsofmobiledeviceapplicationinterface.GoogleMapsandBaidumapsarethebestinthefieldofmobilemaps,becausebothmapsprovidearichofAPI,makinganydevelopercaneasilyusemapfunctionsattachintotheirapplications[1].BycallingtheMapSDKinterfaceyoucaneasilyaccesstheBaidumapserviceanddataonyourphone,alsocanbuildfeature-richandinteractivemobilemapapplication.AndUIdesignborrowedfromBaidusimpledesignstyle,it'sconciseandunique.TheJavadevelopmentlanguageandthelatestdevelopmentsoftwareforAndroidStudioprovideastabledevelopmentenvironmentanddevelopmentplatformforit.Thedesigncanprovidemapdisplay(cityheatmap,satellitemap,cityreal-timetrafficinformationmap),positioning,operationfunctionandsupporttothecityPOIsearchandshowthedetailsofthelist.AccordingtothePOIsearchresultsandlong-pressthemaptosetthedestinationoperationwillbecoveredtoshowarichermap.AtthepresentitalsocansupportthecallfunctionfromBaidumapinclude(drivingnavigationandridingnavigation).Accordingtonavigation,itcanbedividedintotwopartssimulationnavigationandreal-timenavigation.Thesimulationnavigationasainnovative,ithasaview lookoverreal-timetrafficandrouteplanningfunctioninadvance,soitimprovenavigationefficiency.Keywords:mapnavigation;Baidumap;Java;AndroidSDK1.1課題研究的背景和目的移動(dòng)互聯(lián)時(shí)代早就已經(jīng)來(lái)臨了,說(shuō)明新的時(shí)代新的技術(shù)已經(jīng)越來(lái)越成熟。當(dāng)移動(dòng)通信和互聯(lián)網(wǎng)結(jié)合在一起之后就形成了我們常說(shuō)的移動(dòng)互聯(lián)網(wǎng),我們的源以及需要查找的手機(jī)應(yīng)用軟件,本畢業(yè)設(shè)計(jì)我已經(jīng)上傳到了百度開(kāi)發(fā)者平臺(tái)通過(guò)掃描本論文末尾的二維碼即可下載。我們的智能手機(jī)是互聯(lián)網(wǎng)背景下非常具有標(biāo)志性的一個(gè)移動(dòng)終端以及客戶端的工具,其實(shí)就相當(dāng)于一臺(tái)“小型的電腦”,比如android系統(tǒng)就相當(dāng)于它獨(dú)立的操作系統(tǒng),可以安裝和卸載軟件,也可以通過(guò)開(kāi)啟無(wú)線網(wǎng)絡(luò)端口自由的接入斷開(kāi)通信網(wǎng)絡(luò),可以通過(guò)SD卡獲得很大的存儲(chǔ)空間和強(qiáng)大的計(jì)算數(shù)據(jù)功能,這就和傳統(tǒng)的手機(jī)有了很大的區(qū)別。在這個(gè)網(wǎng)絡(luò)技術(shù)日新月異的促進(jìn)下,我國(guó)在通信技術(shù)領(lǐng)域早已經(jīng)進(jìn)入了第四代,即4G時(shí)代的出現(xiàn),讓我們可以享受到更加快速的網(wǎng)絡(luò)傳輸速度和更智能的手機(jī)移動(dòng)設(shè)備。現(xiàn)如今手機(jī)成為了我們?nèi)粘I钪斜夭豢缮俚囊坏捞瘘c(diǎn)。隨著現(xiàn)在科技的進(jìn)步人們的生活水平在不斷提升,人們已經(jīng)不用思考柴米油鹽和溫飽問(wèn)題而開(kāi)始熱衷于如何提升生活的質(zhì)量,所以普通只可以打電話發(fā)短信的手機(jī)已經(jīng)無(wú)法滿足人們的需要了。于是產(chǎn)生了智能手機(jī)。通過(guò)相關(guān)調(diào)查研究表明人們對(duì)于智能手機(jī)的使用率已經(jīng)達(dá)到了90%以上,智能手機(jī)也被開(kāi)發(fā)者設(shè)計(jì)得越來(lái)越人性化,人們可以通過(guò)手機(jī)將完成越來(lái)越人性化的功能,可以說(shuō)智能手機(jī)已經(jīng)成為了人們生活的一部分。隨著越來(lái)越多的人通過(guò)android來(lái)解決問(wèn)題,現(xiàn)在和地圖相關(guān)的APP在手機(jī)上的應(yīng)用已經(jīng)可以算是非常廣泛了,和傳統(tǒng)電腦PC端的地圖軟件相比之下手機(jī)地圖APP可以具備隨時(shí)隨地查看并且可以非常輕松的規(guī)劃出出行路線并且還能夠進(jìn)行導(dǎo)航,方便度有了明顯的差距。所以我們可以開(kāi)發(fā)出一款手機(jī)移動(dòng)端地圖來(lái)方便人們的生活。1.2國(guó)內(nèi)外研究現(xiàn)狀手機(jī)以及一些其他的移動(dòng)設(shè)備為人們帶來(lái)了越來(lái)越多越來(lái)越方便的生活,不斷出現(xiàn)的手機(jī)地圖系統(tǒng)的相關(guān)軟件為在外出行的人提供了途徑,節(jié)約了時(shí)間也極大地提高了效率。所以和手機(jī)地圖相關(guān)的研究在學(xué)術(shù)研究中開(kāi)始慢慢顯現(xiàn)出來(lái)了,其中就包括了市場(chǎng)數(shù)據(jù)研究和應(yīng)用數(shù)據(jù)研究。根據(jù)報(bào)告,2015年中國(guó)IT研究中心的相關(guān)研究對(duì)目前市場(chǎng)上份額排名前幾位的地圖軟件展開(kāi)了調(diào)查,通過(guò)調(diào)查對(duì)前幾位的軟件進(jìn)行了排名,根據(jù)結(jié)果顯示,目前百度手機(jī)地圖排名第一,市場(chǎng)份額65.5%,由此可見(jiàn)更多人愿意使用百度地圖來(lái),高德地圖排名第二,市場(chǎng)份額20.1%,搜狗地圖排名第三,市場(chǎng)份額8.4%。15年手機(jī)地圖市場(chǎng)份額如圖1-1所示:圖1-12015年手機(jī)地圖累計(jì)市場(chǎng)份額手機(jī)地圖作為移動(dòng)互聯(lián)網(wǎng)的重要入口之一,各互聯(lián)網(wǎng)巨頭紛紛加大資源投入力度,展開(kāi)對(duì)手機(jī)地圖市場(chǎng)的爭(zhēng)奪。2014年高德地圖經(jīng)歷了換帥,宣布發(fā)力LBS,專注位置解決方案,打出“你敢用就敢賠”的活動(dòng);百度地圖則展開(kāi)國(guó)際化戰(zhàn)略,新提供境外地圖數(shù)據(jù),與相關(guān)地圖合作開(kāi)放全球定位能力;搜狗地圖成為蘋(píng)果官方AppleWatch首批邀請(qǐng)入駐的應(yīng)用。在此背景下,從2015年第1季度中國(guó)手機(jī)地圖主要APP的累積用戶數(shù)、活躍用戶數(shù)、用戶關(guān)注度、用戶日均定位請(qǐng)求數(shù)等相關(guān)指標(biāo)說(shuō)明現(xiàn)在的中國(guó)手機(jī)地圖的市場(chǎng)情況。CNIT分析認(rèn)為,手機(jī)地圖市場(chǎng)集中度高。百度地圖、高德地圖和搜狗地圖位列三甲,份額超90%,這和手機(jī)地圖產(chǎn)品特性有關(guān),需相應(yīng)的資質(zhì)才能運(yùn)營(yíng),且還需實(shí)時(shí)更新相關(guān)數(shù)據(jù),構(gòu)成一定的技術(shù)門(mén)檻。15年中國(guó)活躍用戶市場(chǎng)份額如圖1-2所示:圖1-22015年中國(guó)活躍用戶市場(chǎng)份額比達(dá)(BigData)數(shù)據(jù)顯示,在2015年Q1中國(guó)手機(jī)地圖活躍用戶市場(chǎng)份額中,百度地圖67.9%最高,高德地圖19.7%居第二,搜狗地圖8.5%位第三,另外,騰訊地圖、谷歌地圖2.4%。因此以百度地圖SDK作為載體根據(jù)百度API提供的文檔來(lái)進(jìn)行開(kāi)發(fā)不僅和獲得更加全面的數(shù)據(jù)而且性能無(wú)疑是最佳的。1.3研究?jī)?nèi)容和設(shè)計(jì)結(jié)構(gòu)1.地圖的定位和我的位置功能在本地圖APP軟件的設(shè)計(jì)中,用戶通過(guò)安裝打開(kāi)軟件之后立刻會(huì)定位到當(dāng)前位置并同時(shí)報(bào)出當(dāng)前位置名稱。并通過(guò)添置按鈕設(shè)置相應(yīng)的單擊事件從而在用戶滑動(dòng)地圖到其他位置后可以通過(guò)此按鈕迅速回到當(dāng)前位置。2.方向傳感器和自定義圖標(biāo)我們都知道智能手機(jī)里面內(nèi)置了很多傳感器,例如:方向傳感器、距離傳感器、陀螺儀傳感器以及重力傳感器等。本應(yīng)用通過(guò)調(diào)用手機(jī)的方向傳感器從而判斷用戶當(dāng)前機(jī)頭所處方向,通過(guò)自定義圖標(biāo)來(lái)指示當(dāng)前方向并通過(guò)方向的不同實(shí)時(shí)更新圖標(biāo)的方向位置。另外導(dǎo)航部分還將調(diào)用距離傳感器來(lái)進(jìn)行算路處理。3.基于城市的地點(diǎn)搜索功能采用下拉列表輸入的方式來(lái)設(shè)置城市和搜索類型,從而獲取到周邊地點(diǎn),首先會(huì)通過(guò)彈窗來(lái)顯示出周邊的位置信息,然后通過(guò)添加覆蓋物的形式來(lái)標(biāo)注出來(lái)。4.GPS導(dǎo)航功能本設(shè)計(jì)地圖軟件還提供智能導(dǎo)航功能,當(dāng)前位置是設(shè)置自動(dòng)默認(rèn)為起點(diǎn),通過(guò)長(zhǎng)按地圖上面的地點(diǎn)來(lái)設(shè)置目的地。同時(shí)會(huì)在目的地上面添加覆蓋物來(lái)標(biāo)注,設(shè)置完目的地之后點(diǎn)擊“模擬導(dǎo)航或者實(shí)時(shí)導(dǎo)航”,將立刻進(jìn)入導(dǎo)航模式。5.開(kāi)啟實(shí)時(shí)路況和城市熱力圖以及可以打開(kāi)衛(wèi)星地圖通過(guò)設(shè)置相關(guān)按鈕和相應(yīng)的單擊事件方法,用戶可以通過(guò)點(diǎn)擊相應(yīng)的按鈕來(lái)獲取到相應(yīng)風(fēng)格的地圖,查看衛(wèi)星地圖要考慮當(dāng)?shù)氐沫h(huán)境和縮放比例。如果發(fā)現(xiàn)當(dāng)前區(qū)域無(wú)地圖可以將縮放比例縮小一點(diǎn)。第2章課題設(shè)計(jì)相關(guān)技術(shù)概述2.1開(kāi)發(fā)語(yǔ)言Java語(yǔ)言作為目前使用排行第一的編程語(yǔ)言不僅具有C++面向?qū)ο蟮奶攸c(diǎn),還根據(jù)“低耦合,高內(nèi)聚”[2]的手機(jī)應(yīng)用程序設(shè)計(jì)特點(diǎn)摒棄了C++里面難以理解的指針和多繼承的特點(diǎn)。因此Java語(yǔ)言就同時(shí)具有了功能強(qiáng)大和簡(jiǎn)單易用的特點(diǎn),所以被很多開(kāi)發(fā)人員采用。Java語(yǔ)言又是一種動(dòng)態(tài)的編程語(yǔ)言,安全性高、分布式使用非常廣泛而且可跨平臺(tái)移植,現(xiàn)在的很多軟件都是用Java語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā)編寫(xiě)的,手機(jī)、個(gè)人筆記本、平板電腦等終端設(shè)備上面的很多軟件都是通過(guò)Java語(yǔ)言的可移植跨平臺(tái)的特性才能使用的只需要安Java開(kāi)發(fā)環(huán)境[3]即可。Java程序具有與體系結(jié)構(gòu)無(wú)關(guān)的特性,可以方便地移植到網(wǎng)絡(luò)上的不同計(jì)算機(jī)當(dāng)中。編程語(yǔ)言排行榜如圖2-1所示:圖2-1編程語(yǔ)言排行榜2.2Android的架構(gòu)Android操作系統(tǒng)應(yīng)用程序框架[4]支持組件的重用與替換。這在之前的手機(jī)操作系統(tǒng)中是難以想象的。這意味著我們可以吧系統(tǒng)中不喜歡的應(yīng)用程序替換掉,安裝我們自己喜歡的應(yīng)用程序。因?yàn)橄到y(tǒng)架構(gòu)主觀上可分為四層架構(gòu),由下而上依次為應(yīng)用層、應(yīng)用框架層、系統(tǒng)運(yùn)行庫(kù)層、Linux內(nèi)核層。Android系統(tǒng)的核心服務(wù)是基于Linux2.6內(nèi)核的,這一層主要功能是讓開(kāi)發(fā)者編寫(xiě)底層程序從而為Android手機(jī)以及基于Android的設(shè)備的各種硬件設(shè)施提供底層驅(qū)動(dòng),比如為藍(lán)牙相機(jī)、無(wú)線網(wǎng)絡(luò)(WIFI)、電源設(shè)備、音頻、顯示器等進(jìn)行驅(qū)動(dòng)。2.系統(tǒng)運(yùn)行庫(kù)層這一層主要是為Android系統(tǒng)提供各種特性支持,比如數(shù)據(jù)庫(kù)可以直接通過(guò)SQLite庫(kù)來(lái)提供(也可以使用外部數(shù)據(jù)庫(kù)如:MySQL3D繪圖支持可以通過(guò)OpenGL/ES庫(kù)提供,瀏覽器內(nèi)核可以通過(guò)Webkit庫(kù)來(lái)提供等。同樣還有一個(gè)運(yùn)行時(shí)庫(kù),它包含一個(gè)核心庫(kù),可以讓開(kāi)發(fā)者運(yùn)用Java語(yǔ)言來(lái)編寫(xiě)Android應(yīng)用。另外Android的運(yùn)行都是可以通過(guò)Dalvik虛擬機(jī)來(lái)進(jìn)行,且都是獨(dú)立運(yùn)行進(jìn)程。另外也可以通過(guò)真機(jī)來(lái)運(yùn)行。總的來(lái)說(shuō)相對(duì)于Java虛擬機(jī)來(lái)說(shuō),Dalvik針對(duì)于移動(dòng)設(shè)備并且完全模擬手機(jī)還能夠針對(duì)手機(jī)內(nèi)存以及CPU來(lái)進(jìn)行優(yōu)化處理。3.應(yīng)用框架層組件也就是API。需要用來(lái)開(kāi)發(fā)Android應(yīng)用程序的工具都具備之后,Google為了大力推廣Android,也希望所有應(yīng)用程序開(kāi)發(fā)者可以順利地轉(zhuǎn)移到Android平臺(tái),因此創(chuàng)建了一系列的應(yīng)用程序架構(gòu)[5]。應(yīng)用程序的架構(gòu)主要是為了簡(jiǎn)化程序組件的重用,從而在遵循框架安全性的前提下快速的的開(kāi)發(fā)應(yīng)用程。可以進(jìn)行視圖(views)擴(kuò)展、優(yōu)化、添加列表(lists)、按鈕(buttons)、文本框(textboxes甚至可以嵌入web瀏覽器。另外還包括四大組件分別是活動(dòng)(Activity)、服務(wù)(Service)、廣播接收器(BroadcastReceiver)和內(nèi)容提供器(ContentProvider)。4.應(yīng)用層這一層顧名思義就是手機(jī)上面的應(yīng)用程序所在的這一層,比如系統(tǒng)自帶的通訊錄、短信、聯(lián)系人等,自己網(wǎng)上下載或者進(jìn)行自己開(kāi)發(fā)的應(yīng)用程序的真機(jī)測(cè)試應(yīng)用。Android平臺(tái)包括一些系統(tǒng)資源,所有的資源都可以直接從你的應(yīng)用程序代碼和使用。也可以從內(nèi)部引用的其他資源。例如,一個(gè)維度中[6]引用資源可能布局的定義。2.3AndroidSDKSDK:軟件開(kāi)發(fā)工具包。比如百度地圖SDK、ShareSDK等是在特定軟件開(kāi)發(fā)過(guò)程中,開(kāi)發(fā)者用相應(yīng)的軟件開(kāi)發(fā)工具包來(lái)進(jìn)行特定的開(kāi)發(fā)工作。AndroidSDK[7]以Java語(yǔ)言為基礎(chǔ),用戶可以使用Java來(lái)開(kāi)發(fā)來(lái)開(kāi)發(fā)Android平臺(tái)的應(yīng)用軟件。也是軟件開(kāi)發(fā)工具包,用于提供Android系統(tǒng)的不同版本的開(kāi)發(fā)所需要的環(huán)境以及工具。在搭建硬件平臺(tái)以及軟件開(kāi)發(fā)的框架時(shí)都需要通過(guò)引入該工具包,才能使用Android開(kāi)發(fā)相關(guān)的API。第3章軟件可行性及需求分析3.1可行性軟件開(kāi)發(fā)過(guò)程中,不僅僅是考慮能不能用技術(shù)實(shí)現(xiàn)出來(lái)而是要全面性的來(lái)根據(jù)可行性考慮,軟件能否成功開(kāi)發(fā)不僅僅需要足夠的技術(shù)還得要有經(jīng)濟(jì)和法律方面的考慮。下面就從技術(shù)、經(jīng)濟(jì)、法律三個(gè)方面來(lái)分析。1.技術(shù)是否可行?本課題的這款手機(jī)定位APP的設(shè)計(jì)實(shí)現(xiàn)最主要還是與程序設(shè)計(jì)相關(guān),因此程序開(kāi)發(fā)語(yǔ)言尤其重要,并且這種語(yǔ)言開(kāi)發(fā)的應(yīng)用必須能夠在Android手機(jī)上面安裝運(yùn)行。所以目前來(lái)說(shuō)現(xiàn)階段的開(kāi)發(fā)語(yǔ)言當(dāng)中,Java語(yǔ)言和C語(yǔ)言等已經(jīng)面世并且相對(duì)來(lái)說(shuō)比較成熟和穩(wěn)定的開(kāi)發(fā)語(yǔ)言,像GO語(yǔ)言雖然是屬于最新出來(lái)編程語(yǔ)言但本身還不夠穩(wěn)定優(yōu)點(diǎn)和缺點(diǎn)一樣明顯所以還得選擇技術(shù)相對(duì)成熟的語(yǔ)言。還有在導(dǎo)航和定位的過(guò)程中需要不斷的訪問(wèn)網(wǎng)絡(luò)數(shù)據(jù)來(lái)獲取當(dāng)前位置和加載地圖,所以隨著我國(guó)第四代網(wǎng)絡(luò)的出現(xiàn)已經(jīng)完全能夠滿足手機(jī)定位APP的開(kāi)發(fā)實(shí)現(xiàn)。操作系統(tǒng):win7;開(kāi)發(fā)工具:AndroidStudio、phtoshopcs6;開(kāi)發(fā)包:百度地圖SDK、jdk1.8.0;2.經(jīng)濟(jì)是否可行?Android開(kāi)發(fā)者和工程師開(kāi)發(fā)軟件最終都是需要獲得收益,所以在真正開(kāi)發(fā)過(guò)程中也需要投入相應(yīng)的資金才能保證效果,但是從百度地圖開(kāi)發(fā)的情況下來(lái)看SDK工具包可以直接到百度地圖API網(wǎng)址上面在免費(fèi)下載,開(kāi)發(fā)人員也不需要很多。實(shí)際上在美工、UI布局、上線都是本人完成的。而且我也不需要盈利,因此從這兩方面來(lái)說(shuō)經(jīng)濟(jì)上面完全沒(méi)有問(wèn)題。3.法律可行?本課題設(shè)計(jì)的基于百度地圖的手機(jī)定位APP,僅僅用于學(xué)習(xí)和做畢業(yè)設(shè)計(jì)。不做任何盈利用途,因此在法律上面沒(méi)有任何問(wèn)題,完全可行。3.2需求分析軟件工程創(chuàng)建之前首先必須先進(jìn)行需求分析,這樣畢竟能夠明確開(kāi)發(fā)目的和方向還能夠進(jìn)行更加人性化科學(xué)的設(shè)計(jì)出來(lái),有時(shí)候還能減小內(nèi)存空間提升軟件運(yùn)行效率。否則,不僅開(kāi)發(fā)的時(shí)候不太明確實(shí)際開(kāi)發(fā)意圖和方向。而且無(wú)法從使用者角度去考慮問(wèn)題,不實(shí)用的功能只會(huì)給開(kāi)發(fā)造成很大的負(fù)擔(dān)和資源浪費(fèi)。因此,在開(kāi)發(fā)的過(guò)程中一定要充分考慮使用者的需求,不僅是在這次基于百度地圖定位的APP開(kāi)發(fā)所有的在Android系統(tǒng)上開(kāi)發(fā)的app都要遵循和體現(xiàn)使用者基本的需求。通過(guò)分析用戶的大致需求如下:可以根據(jù)當(dāng)前城市名查詢周邊的地點(diǎn),美食、酒店、學(xué)校、醫(yī)院等;可以能夠查看實(shí)時(shí)路況地圖、城市熱力地圖、衛(wèi)星地圖等三種不同的使用模式;可以在滑動(dòng)地圖查找地點(diǎn)的之后點(diǎn)擊當(dāng)前按鈕迅速回到當(dāng)前位置;可以根據(jù)方向傳感器的數(shù)據(jù)實(shí)時(shí)辨別當(dāng)前方向,開(kāi)啟羅盤(pán)模式之后更加直觀;可以通過(guò)長(zhǎng)按設(shè)置目的地并且添加標(biāo)識(shí);可以進(jìn)行模擬導(dǎo)航用來(lái)快速實(shí)時(shí)查看當(dāng)前路況;可以開(kāi)啟實(shí)時(shí)導(dǎo)航地圖會(huì)自動(dòng)規(guī)劃出最優(yōu)線路,在駕車(chē)過(guò)程中計(jì)算車(chē)速和距離以及預(yù)計(jì)到達(dá)時(shí)間,最后完成導(dǎo)航。3.3地圖系統(tǒng)運(yùn)行的功能架構(gòu)在實(shí)際工作過(guò)程中,經(jīng)常需要介紹業(yè)務(wù)運(yùn)行流程。而業(yè)務(wù)運(yùn)行流程則由特定的圖形和符號(hào)來(lái)表示地圖系統(tǒng)運(yùn)行的功能架構(gòu),不僅可以用來(lái)分析軟件整理和接受結(jié)果的過(guò)程,還可以更加直觀的發(fā)現(xiàn)其中不合理的流程。業(yè)務(wù)流程圖標(biāo)及功能架構(gòu)如圖3-1、圖3-2所示:圖3-1業(yè)務(wù)流程圖標(biāo)圖3-2地圖系統(tǒng)的功能架構(gòu)圖第4章百度Key(密鑰)申請(qǐng)4.1申請(qǐng)百度密鑰百度地圖SDK是一套基于Android2.1及以上版本的應(yīng)用程序設(shè)備接口。通過(guò)該接口開(kāi)發(fā)者才能使用百度地圖SDK的各項(xiàng)功能,并且使用無(wú)次數(shù)限制。在使用百度地圖SDK的各項(xiàng)LBS功能之前,必須先獲得百度地圖的密鑰。非營(yíng)利項(xiàng)目可以直接使用。首先注冊(cè)并登錄百度賬號(hào),搜索并進(jìn)入“百度地圖API”官網(wǎng)??梢韵冗x擇“Android開(kāi)發(fā)”了解一下也可以直接點(diǎn)擊“申請(qǐng)密鑰”。百度API如圖4-1所示:圖4-1百度API點(diǎn)擊“創(chuàng)建應(yīng)用”,并將“應(yīng)用類型”改為“AndroidSDK”。然后獲取SHA1值和包名。獲取包名及SHA1值如圖4-2、圖4-3所示:圖4-2獲取包名圖4-3獲得SHA1值包名和SHA1值的具體獲取步驟:包名直接在工程文件下面的“build.gradle”文件里面獲取。第1步:運(yùn)行進(jìn)入控制臺(tái)第2步:定位到.android文件夾下,輸入cd.android第3步:輸入keytool-list-v-keystoredebug.keystore,會(huì)得到三種指紋證書(shū),選取SHA1類型的證書(shū)(密鑰口令是android例如:其中keytool為jdk自帶工具;keystorefile為Android簽名證書(shū)文件配置完成后點(diǎn)擊“提交”,即可獲得key(密鑰)。獲得密鑰key如圖4-4所示:圖4-4獲得密鑰key4.2配置百度地圖SDK工程環(huán)境在“project”目錄下的libs目錄下面放入下載好的baidumapapi_vXXX.jar包。在main文件夾下面新建“jniLibs”目錄放入下載好的armeabi文件夾。添加jar包和so文件如圖4-5所示:圖4-5放入jar包和so文件baidumapapi_vXXX.jar包。點(diǎn)擊“AddAsLibrary”更新項(xiàng)目jar包如圖4-6所示:圖4-6導(dǎo)包更新工程最后需要查看jar包入工程的關(guān)系,并將需要的jar包加入工程,或者刪除暫不需要的jar包。因?yàn)楣δ懿煌琷ar包也不同。4.2將Key添加到manifests文件application當(dāng)中Android定位SDK4.2及之后版本需要在Mainfest.xml正確設(shè)置Accesskey(AK如果設(shè)置錯(cuò)誤將會(huì)導(dǎo)致定位和地理圍欄服務(wù)無(wú)法正常使用。設(shè)置AK就是在Application標(biāo)簽中加入開(kāi)發(fā)者申請(qǐng)的Key:<!--在application中添加開(kāi)發(fā)密鑰--><meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="cckSXBHIsdQGVMwZ4m6ISFRdPuPZkn2p"/>第5章系統(tǒng)設(shè)計(jì)5.1系統(tǒng)功能結(jié)構(gòu)根據(jù)百度地圖的應(yīng)用,是有開(kāi)機(jī)閃屏頁(yè)之后才正式跳轉(zhuǎn)到地圖頁(yè)面(首次啟動(dòng)還會(huì)有開(kāi)機(jī)引導(dǎo)頁(yè),由于圖片太多容易造成內(nèi)存泄漏并且也為了減少軟件大小就舍棄了)。而地圖頁(yè)面作為前臺(tái)讓用戶根據(jù)自己的需求來(lái)使用地圖,能夠進(jìn)行周邊查詢。選擇喜歡的使用模式、查看當(dāng)前方向以及一些導(dǎo)航操作。為了充分考慮簡(jiǎn)潔性和方便性本人參考了下百度地圖的頁(yè)面設(shè)計(jì),盡量看起來(lái)賞心悅目。地圖根據(jù)功能在前臺(tái)一一添加按鈕,主要功能包括根據(jù)城市名和搜索類型來(lái)搜索周邊地點(diǎn);用戶可以選擇自己喜歡的使用模式:衛(wèi)星地圖、實(shí)況交通、城市熱力圖;用戶可以在滑動(dòng)地圖查找地點(diǎn)之后通過(guò)定位按鈕重新回到當(dāng)前地圖中心位置;啟動(dòng)方向羅盤(pán)來(lái)辨別方向;還調(diào)用了方向傳感器來(lái)動(dòng)態(tài)實(shí)時(shí)更新箭頭位置方向十分靈敏;該系統(tǒng)還能夠設(shè)置目的地來(lái)進(jìn)行模擬導(dǎo)航和實(shí)時(shí)導(dǎo)航。系統(tǒng)功能架構(gòu)如圖5-1所示:圖5-1系統(tǒng)功能結(jié)構(gòu)圖5.2申明軟件應(yīng)用權(quán)限Android定義了一種權(quán)限方案來(lái)保護(hù)設(shè)備上的資源和功能。例如,在默認(rèn)情況下,應(yīng)用程序無(wú)法訪問(wèn)聯(lián)系人列表、撥打電話、發(fā)送短信等。下面就是本應(yīng)用中需要用到和可能需要用到的權(quán)限。當(dāng)我們不確定是否需要這個(gè)權(quán)限的時(shí)候盡量還是選擇添加,畢竟不會(huì)影響軟件的使用而且還能提高軟件的兼容性。權(quán)限代碼如下:<!--添加ShareSDK(分享)權(quán)限--><uses-permissionandroid:name="android.Permission.MANAGE_ACCOUNTS"/><uses-permissionandroid:name="android.Permission.GET_ACCOUNTS"/><!--藍(lán)牙分享所需的權(quán)限--><uses-permissionandroid:name="android.Permission.BLUETOOTH"/><uses-permissionandroid:name="android.Permission.BLUETOOTH_ADMIN"/><!--這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位--><uses-permissionandroid:name="android.Permission.ACCESS_COARSE_LOCATION"/><!--這個(gè)權(quán)限用于訪問(wèn)GPS定位--><uses-permissionandroid:name="android.Permission.ACCESS_FINE_LOCATION"/><!--用于訪問(wèn)wifi網(wǎng)絡(luò)信息,wifi信息會(huì)用于進(jìn)行網(wǎng)絡(luò)定位--><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><!--獲取運(yùn)營(yíng)商信息,用于支持提供運(yùn)營(yíng)商信息相關(guān)的接口--><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><!--這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會(huì)用來(lái)進(jìn)行網(wǎng)絡(luò)定位--><uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/><!--用于讀取手機(jī)當(dāng)前的狀態(tài)--><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/><!--寫(xiě)入擴(kuò)展存儲(chǔ),向擴(kuò)展卡寫(xiě)入數(shù)據(jù),用于寫(xiě)入離線定位數(shù)據(jù)--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--訪問(wèn)網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)--><uses-permissionandroid:name="android.Permission.INTERNET"/><!--SD卡讀取權(quán)限,用戶寫(xiě)入離線定位數(shù)據(jù)--><uses-permissionandroid:name="android.Permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/><uses-permissionandroid:name="android.permission.WAKE_LOCK"/><uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/><uses-permissionandroid:name="android.permission.BAIDU_LOCATION_SERVICE"/><uses-permissionandroid:name="android.permission.ACCES_MOCK_LOCATION"/><uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/><uses-permissionandroid:name="android.permission.ACCESS_GPS"/><!--SDK1.5需要android.permission.GET_TASKS權(quán)限判斷本程序是否為當(dāng)前運(yùn)行的應(yīng)用?--><uses-permissionandroid:name="android.permission.GET_TASKS"/><uses-permissionandroid:name="android.Permission.BROADCAST_STICKY"/><!--來(lái)電消音--><uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/><uses-permissionandroid:name="android.Permission.MODIFY_AUDIO_SETTINGS"/><uses-permissionandroid:name="android.permission.RECORD_AUDIO"/><!--攝影機(jī)--><uses-permissionandroid:name="android.permission.CAMERA"/><!--截圖--><uses-permissionandroid:name="android.Permission.WRITE_EXTERNAL_STORAGE"/>5.3基本配置因?yàn)楸緫?yīng)用是調(diào)用的百度SDK所以我們需要調(diào)用百度SDK的接口,而百度也因此為我們開(kāi)發(fā)者提供了十分便捷的百度地圖顯示接口,通過(guò)以下幾步我們就可以在應(yīng)用中使用百度地圖的所用數(shù)據(jù)了。Service(服務(wù))[8]是能夠在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作并且不提供用戶界面的應(yīng)用程序組件。其他應(yīng)用程序組件能啟動(dòng)服務(wù),并且即便用戶切換到另一個(gè)應(yīng)用程序,服務(wù)還可以在后臺(tái)運(yùn)行。第一步,在application標(biāo)簽中聲明service組件:<!--在application標(biāo)簽中聲明service組件,每個(gè)app擁有自己?jiǎn)为?dú)的定位service--><serviceandroid:name="com.Baidu.location.f"android:enabled="true"android:process=":remote"/>第二步,在布局xml文件中添加地圖控件:<!--在布局xml文件中添加地圖控件;--><com.baidu.mapapi.map.MapViewandroid:id="@+id/bmapView"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_alignParentTop="true"android:clickable="true"/>第三步,創(chuàng)建地圖的活動(dòng)(Activity)管理地圖生命周期://管理地圖生命周期@OverrideprotectedvoidonDestroy(){super.onDestroy();//在activity執(zhí)行onDestroy時(shí)執(zhí)行mMapView.onDestroy(),實(shí)現(xiàn)地圖生命周期管理mMapView.onDestroy();}@OverrideprotectedvoidonResume(){super.onResume();//在activity執(zhí)行onResume時(shí)執(zhí)行mMapView.onResume(),實(shí)現(xiàn)地圖生命周期管理mMapView.onResume();}@OverrideprotectedvoidonPause(){super.onPause();//在activity執(zhí)行onPause時(shí)執(zhí)行mMapView.onPause(),實(shí)現(xiàn)地圖生命周期管理mMapView.onPause();}第6章系統(tǒng)實(shí)現(xiàn)6.1系統(tǒng)運(yùn)行環(huán)境和開(kāi)發(fā)平臺(tái)系統(tǒng)開(kāi)發(fā)及運(yùn)行環(huán)境和硬件信息如表1所示:表1系統(tǒng)開(kāi)發(fā)及運(yùn)行環(huán)境和硬件信息表硬件名稱硬件詳細(xì)信息CPUCore?i3.2.40GHz及以上配置4G及以上配置硬盤(pán)500G及以上配置顯示器分辨率在1366×768像素及以上網(wǎng)絡(luò)1M及以上操作系統(tǒng)Windows764位/32位開(kāi)發(fā)工具AndroidStudio1.5、photoshopcs6圖6-1開(kāi)機(jī)閃屏頁(yè)6.2系統(tǒng)開(kāi)機(jī)閃屏頁(yè)面6-1所示:關(guān)鍵代碼如下://在注冊(cè)事件方法中設(shè)置3秒后啟動(dòng)handler.sendEmptyMessageDelayed(START_ACTIVITY,3000);//Handler實(shí)現(xiàn)跳轉(zhuǎn)privateandroid.os.Handlerhandler=newandroid.os.Handler(){@OverridepublicvoidhandleMessage(Messagemsg){super.handleMessage(msg);switch(msg.what){caseSTART_ACTIVITY://從當(dāng)前界面跳到要開(kāi)啟的界面startActivity(newIntent(SplashActivity.this,MapActivity.class));}6.3地圖主界面這是開(kāi)機(jī)完成后的地圖主界面,打開(kāi)地圖之后。自動(dòng)開(kāi)啟方向傳感器和定位,同時(shí)打開(kāi)羅盤(pán)俯瞰模式(3秒后退出到時(shí)會(huì)保持俯瞰)。在此頁(yè)面用戶可以搜索、定位、切換模式等需要的操作。地圖主界面如圖6-2所示:圖6-2地圖主界面6.3.1設(shè)置請(qǐng)求定位信息開(kāi)啟軟件之后軟件會(huì)自動(dòng)定位到當(dāng)前位置,當(dāng)滑動(dòng)地圖之后也可以點(diǎn)擊“我的”按鈕,重新定位到當(dāng)前位置并顯示到地圖中央。關(guān)鍵代碼如下:privateclassMyLocationListnerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){//定位成功回調(diào)函數(shù)//mapview銷(xiāo)毀后不再處理新的接收位置if(location==null||mMapView==null)return;//構(gòu)造定位數(shù)據(jù)MyLocationDatadata=newMyLocationData.Builder()//構(gòu)造我的位置當(dāng)前信息.accuracy(location.getRadius())//設(shè)置精度.latitude(location.getLatitude())//設(shè)置緯度.longitude(location.getLongitude())//設(shè)置經(jīng)度.direction(mCureentX)//設(shè)置圖標(biāo)的方向值.build();mBaiduMap.setMyLocationData(data);//將位置信息轉(zhuǎn)換為data數(shù)據(jù)//設(shè)置定位圖層定位圖標(biāo)//COMPASS顯示指南針導(dǎo)航標(biāo)志FOLLOWING跟隨態(tài)保持定位圖標(biāo)在地圖中心MyLocationConfigurationconfig=newMyLocationConfiguration(mLocationMode,true,mIconLocation);//調(diào)用定位圖標(biāo)mBaiduMap.setMyLocationConfigeration(config);mLocationMode=MyLocationConfiguration.LocationMode.NORMAL;//每次定位成功之后更新數(shù)據(jù)mLatitude=location.getLatitude();mlongtitude=location.getLongitude();//判斷是否是第一次定位if(isFirstIn){//獲取經(jīng)緯度LatLnglatLng=newLatLng(mLatitude,mlongtitude);MapStatusUpdatemsu=MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);//地圖的位置使用動(dòng)畫(huà)效果轉(zhuǎn)過(guò)去mLastLocationData=latLng;//記錄起點(diǎn)位置isFirstIn=false;//將位置報(bào)出來(lái)。Toast.makeText(context,location.getAddrStr(),Toast.LENGTH_SHORT).show();}}6.3.2定位監(jiān)聽(tīng)器/配置事件監(jiān)聽(tīng)器地圖應(yīng)用需要進(jìn)行初始設(shè)置以便能讓用戶打開(kāi)軟件之后就能獲得比較好的體驗(yàn),例如:國(guó)際經(jīng)緯度坐標(biāo)標(biāo)準(zhǔn)為WGS-84,國(guó)內(nèi)必須至少使用國(guó)測(cè)局制定的GCJ-02,對(duì)地理位置進(jìn)行首次加密。百度坐標(biāo)在此基礎(chǔ)上,進(jìn)行了BD-09二次加密措施,更加保護(hù)了個(gè)人隱私。百度對(duì)外接口的坐標(biāo)系并不是GPS采集的真實(shí)經(jīng)緯度,需要通過(guò)坐標(biāo)轉(zhuǎn)換接口進(jìn)行轉(zhuǎn)換等。另外地圖的精度也可以設(shè)置并可以通過(guò)設(shè)置定位請(qǐng)求時(shí)間,以及初始化方向傳感器。關(guān)鍵代碼如下:privatevoidinitLocation(){mLocationMode=MyLocationConfiguration.LocationMode.COMPASS;//模式切換mLocationClient=newLocationClient(this);//聲明定位監(jiān)聽(tīng)器myLocationListner=newMyLocationListner();//實(shí)例化定位監(jiān)聽(tīng)器mLocationClient.registerLocationListener(myLocationListner);//注冊(cè)定位監(jiān)聽(tīng)器//配置事件監(jiān)聽(tīng)器LocationClientOptionoption=newLocationClientOption();//可選,默認(rèn)高精度,設(shè)置定位模式,高精度option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);option.setCoorType("bd09ll");//定義地圖坐標(biāo)系option.setIsNeedAddress(true);//返回的位置結(jié)果包含地址信息option.setOpenGps(true);//開(kāi)啟GPSoption.setScanSpan(1000);//每隔1秒·請(qǐng)求定位一次//option.setNeedDeviceDirect(true);//定位結(jié)果包含機(jī)頭方向mLocationClient.setLocOption(option);//必須設(shè)置否者無(wú)法監(jiān)聽(tīng)mLocationClient.start();//啟動(dòng)SDK定位mLocationClient.requestLocation();//發(fā)送請(qǐng)求//初始化定位圖標(biāo)mIconLocation=BitmapDescriptorFactory.fromResource(R.drawable.fangxiang);//初始化方向傳感器mMyOrientationListener=newMyOrientationListener(this);//回調(diào)方向傳感器mMyOrientationListener.setOnOrientationListener(newMyOrientationListener.OnOrientationListener(){@OverridepublicvoidonOrientationChanged(floatx){mCureentX=x;//接受新的X方位});}6.3.3最后需要設(shè)置開(kāi)啟和關(guān)閉定位定位開(kāi)啟之后當(dāng)然需要能夠關(guān)閉不能夠一直定位,這樣用戶肯定是不能接受的,因此我們就需要既能夠開(kāi)啟定位又能夠關(guān)閉定位,以及方向傳感器的開(kāi)啟和關(guān)閉。關(guān)鍵代碼如下:定位完成之后需要退出所以(onstop,onstar)@OverrideprotectedvoidonStart(){super.onStart();mBaiduMap.setMyLocationEnabled(true);//是否允許開(kāi)啟定位//進(jìn)行判斷是否啟動(dòng)if(!mLocationClient.isStarted())mLocationClient.start();//開(kāi)啟定位}@OverrideprotectedvoidonStop(){super.onStop();mBaiduMap.setMyLocationEnabled(false);//不允許開(kāi)啟定位mLocationClient.stop();}6.3.4方向傳感器Android系統(tǒng)的一大亮點(diǎn)之一就是對(duì)傳感器[9]的應(yīng)用,利用傳感器可以開(kāi)發(fā)出很多新奇有趣的程序,小到水平儀、計(jì)步器,大到傳感器游戲,這里是地圖應(yīng)用的方向傳感器功能就是當(dāng)轉(zhuǎn)動(dòng)手機(jī)的時(shí)候,地圖上顯示個(gè)人所在位置的圖標(biāo)的箭頭變動(dòng),傳感器隨著定位的開(kāi)始而開(kāi)啟,隨著定位的結(jié)束而結(jié)束傳感器獲得位置的移動(dòng)而更新方向。關(guān)鍵代碼如下://開(kāi)始監(jiān)聽(tīng)@SuppressWarnings("deprecation")publicvoidstart(){//通過(guò)傳感器管理者拿到傳感器mSensorManager=(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);//判斷是否開(kāi)啟傳感器管理者if(mSensorManager!=null){ //獲得方向傳感器mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}//判斷傳感器是否為空if(mSensor!=null){//設(shè)置感應(yīng)精度.SENSOR_DELAY_GAMEmSensorManager.registerListener(this,mSensor,SensorManager.SENSOR_DELAY_UI);}//結(jié)束監(jiān)聽(tīng)publicvoidstop(){//移除監(jiān)聽(tīng)停止定位mSensorManager.unregisterListener(this);}6.3.5檢測(cè)當(dāng)方向發(fā)生改變時(shí)這里的思路是和指南針?biāo)悸穂10]是一樣的:程序先準(zhǔn)備一張指南針圖片,該圖片上方指針指向北方。然后檢測(cè)和接收傳感器在更新圖層從而達(dá)到改變方向的效果。關(guān)鍵代碼如下://判斷返回傳感器類型是否為方向傳感器if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){floatx=event.values[SensorManager.DATA_X];//判斷方向與最新的x進(jìn)行比對(duì)從而做出改變//只要偏差大于1.0就會(huì)通知主界面更新if(Math.abs(x-lastX)>1.0){if(mOnOrientationListener!=null){mOnOrientationListener.onOrientationChenged(x);}}lastX=x;//最后將新的x值傳過(guò)來(lái)}6.4實(shí)時(shí)路況界面這是地圖實(shí)時(shí)路況界面,點(diǎn)擊“路況”按鈕之后就開(kāi)始實(shí)時(shí)查看目前為止的路況信息,綠色表示此路段暢通、黃色表示此路段緩行、紅色表示此路段擁堵如果為灰色則表示此路段無(wú)信息。實(shí)時(shí)路況界面如圖6-3所示:圖6-3實(shí)時(shí)路況界面關(guān)鍵代碼如下(按鈕單擊事件部分):caseR.id.id_map_traffic://實(shí)時(shí)交通//做一個(gè)判斷如果當(dāng)前已經(jīng)是交通圖,點(diǎn)擊會(huì)關(guān)閉。否則打開(kāi)交通圖if(mBaiduMap.isTrafficEnabled()){mBaiduMap.setTrafficEnabled(false);//.setTitle("實(shí)時(shí)交通(off)");}else{mBaiduMap.setTrafficEnabled(true);//item.setTitle("實(shí)時(shí)交通(on)");}break;6.5視圖界面這是視圖模式界面,通過(guò)點(diǎn)擊屏幕上的“衛(wèi)星圖標(biāo)”可以查看2D平面圖、3D俯瞰圖。還可以根據(jù)需求切換為衛(wèi)星圖的2D、3D模式。6.5.1衛(wèi)星地圖界面這是衛(wèi)星地圖界面,通過(guò)點(diǎn)擊左邊的“熊貓LOGO”按鈕可以切換為普通地圖模式。衛(wèi)星界面如圖6-4所示:圖6-4衛(wèi)星界面關(guān)鍵代碼如下:caseR.id.id_map_site://衛(wèi)星地圖mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;6.5.2城市熱力圖界面這是城市熱力圖通過(guò)點(diǎn)擊“路況”按鈕下的“熱力切換圖”按鈕可以查看當(dāng)前區(qū)域溫度的情況再點(diǎn)擊一次后即可恢復(fù)為普通模式。熱力圖界面如圖6-5所示:圖6-5熱力圖界面關(guān)鍵代碼如下:caseR.id.id_map_heat://普通地圖//普通地圖到熱力切換if(mBaiduMap.isBaiduHeatMapEnabled()){mBaiduMap.setBaiduHeatMapEnabled(false);}else{mBaiduMap.setBaiduHeatMapEnabled(true);break;6.6搜索界面這是地圖的搜索及結(jié)果頁(yè)面,通過(guò)選擇城市名和搜索類型再點(diǎn)擊“搜索”按鈕就可以查找城市內(nèi)搜索信息,同時(shí)還可以通過(guò)彈窗顯示出來(lái)并在地圖上添加“覆蓋物”進(jìn)行標(biāo)注。搜索類型包括:美食、學(xué)校、酒店、醫(yī)院、銀行等。搜索界面及搜索結(jié)果彈窗界面和搜索結(jié)果標(biāo)注界面如圖6-6、圖6-7和圖6-8所示:圖6-6搜索界面這是通過(guò)下拉列表的方式來(lái)存儲(chǔ)城市名和搜索類型從而可以避免輸入錯(cuò)誤而導(dǎo)致軟件崩潰的情況發(fā)生。關(guān)鍵代碼如下://每次搜索前先前sb中的內(nèi)容清空sb=newStringBuilder();//輸入正確城市名和關(guān)鍵字StringcityWord=spinner_city.getSelectedItem().toString();StringkeyWord=spinner_keyword.getSelectedItem().toString();//發(fā)起檢索請(qǐng)求poiSearch.searchInCity((newPoiCitySearchOption()).city(cityWord).pageNum(10).keyword(keyWord));圖6-7搜索結(jié)果彈窗界面當(dāng)啟動(dòng)搜索之后,搜索結(jié)果的POI信息當(dāng)然能夠顯示出來(lái)是最好的,所以我采用了彈窗的方式來(lái)顯示搜索結(jié)果的POI信息,因?yàn)橄拗扑灾荒茏疃囡@示10條信息。關(guān)鍵代碼如下://通過(guò)AlertDialog顯示當(dāng)前頁(yè)搜索到的POInewAlertDialog.Builder(MapActivity.this).setTitle("搜索到的POI信息").setMessage(sb.toString()).setPositiveButton("關(guān)閉",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){dialog.dismiss();}}).create().show();圖6-8搜索結(jié)果標(biāo)注界面當(dāng)獲取到搜索結(jié)果的POI之后當(dāng)然最好可以在地圖上面標(biāo)注出來(lái),因此可以采用添加覆蓋物的方式來(lái)進(jìn)行標(biāo)注,這里我采用的是紅色位置圖標(biāo)。關(guān)鍵代碼如下://poi實(shí)例化poiSearch=PoiSearch.newInstance();//創(chuàng)建POI檢索的監(jiān)聽(tīng)事件OnGetPoiSearchResultListenerpoiListener=newOnGetPoiSearchResultListener(){@OverridepublicvoidonGetPoiResult(PoiResultpoiResult){//獲取POI檢索結(jié)果if(poiResult==null||poiResult.error==SearchResult.ERRORNO.RESULT_NOT_FOUND){//沒(méi)有檢索到信息Toast.makeText(MapActivity.this,"未找到結(jié)果",Toast.LENGTH_LONG).show();return;}else{List<PoiInfo>poiInfolist=poiResult.getAllPoi();//記錄搜索到的POI數(shù)目sb.append("共搜索到").append(poiResult.getTotalPageNum()).append("個(gè)POI\n");//清除地圖上上次已有的所有覆蓋物mBaiduMap.clear();for(PoiInfop:poiInfolist){System.out.println(p.address+"=="+p.city+"=="++"=="+p.phoneNum);//添加POI檢索位置覆蓋物BitmapDescriptorbd=BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);//構(gòu)建MakerOption,用于在地圖上添加覆蓋物圖標(biāo)(p.loction來(lái)設(shè)置經(jīng)緯度)OverlayOptionsoptions=newMarkerOptions().position(p.location).icon(bd);//在地圖上添加進(jìn)來(lái)mBaiduMap.addOverlay(options);//添加每次搜索到POI信息的名稱sb.append("名稱:").append().append("\n");}//通過(guò)AlertDialog顯示當(dāng)前頁(yè)搜索到的POInewAlertDialog.Builder(MapActivity.this).setTitle("搜索到的POI信息").setMessage(sb.toString()).setPositiveButton("關(guān)閉",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){dialog.dismiss();}}).create().show();}}@OverridepublicvoidonGetPoiDetailResult(PoiDetailResultpoiDetailResult){//獲取Place詳情頁(yè)檢索結(jié)果}@OverridepublicvoidonGetPoiIndoorResult(PoiIndoorResultpoiIndoorResult){//設(shè)置POI檢索監(jiān)聽(tīng)者poiSearch.setOnGetPoiSearchResultListener(poiListener);6.7導(dǎo)航界面這是導(dǎo)航界面通過(guò)長(zhǎng)按地圖來(lái)設(shè)置目的地同時(shí)會(huì)用覆蓋物標(biāo)注出來(lái),通過(guò)設(shè)置目的地再點(diǎn)擊:“模擬”和“實(shí)時(shí)”按鈕即可實(shí)施相應(yīng)的導(dǎo)航功能。適用于車(chē)載導(dǎo)航。6.7.1通過(guò)長(zhǎng)按地圖設(shè)置目的地,并添加標(biāo)識(shí)。設(shè)置目的地界面如圖6-9所示:圖6-9設(shè)置目的地界面當(dāng)用戶需要導(dǎo)航的時(shí)候,可以通過(guò)長(zhǎng)按地圖上面的目的地來(lái)進(jìn)行設(shè)置。并且軟件會(huì)將用戶的目的地通過(guò)添加終點(diǎn)覆蓋物“圖標(biāo)”的方式標(biāo)識(shí)出來(lái)。關(guān)鍵代碼如下://設(shè)置地圖的長(zhǎng)按事件mBaiduMap.setOnMapLongClickListener(newBaiduMap.OnMapLongClickListener(){@OverridepublicvoidonMapLongClick(LatLnglg){Toast.makeText(MapActivity.this,"設(shè)置目的地成功",Toast.LENGTH_SHORT).show();mDestLocationData=lg;addDestInfoOverlay(lg);//設(shè)置調(diào)用事件});//長(zhǎng)按事件方法privatevoidaddDestInfoOverlay(LatLngdestInfo){mBaiduMap.clear();//清楚所有的overlayOverlayOptionsoptions=newMarkerOptions().position(destInfo).icon(BitmapDescriptorFactory.fromResource(R.drawable.icon_en)).zIndex(5);//傳入圖片mBaiduMap.addOverlay(options);}6.7.2模擬、實(shí)時(shí)導(dǎo)航界面這是模擬導(dǎo)航界面,通過(guò)點(diǎn)擊“模擬導(dǎo)航”按鈕用戶可以進(jìn)行路線的全程模擬從而更加詳細(xì)了解規(guī)劃路線的目前為止(當(dāng)前)的路況信息。模擬導(dǎo)航界面如圖6-10所示:圖6-10模擬導(dǎo)航界面因?yàn)橛脩粼O(shè)置目的地之后肯定也不太清楚當(dāng)前自駕車(chē)路線的實(shí)際路況情況,所以這里提供了一個(gè)模擬導(dǎo)航功能,可以讓用戶提前了解到路線的路況信息(多少個(gè)彎道、紅綠燈等)。提前來(lái)熟悉道路情況。關(guān)鍵代碼如下://判斷當(dāng)前導(dǎo)航是否可用privatebooleaninitDirs(){mSDCardPath=getSdcardDir();//調(diào)用判斷當(dāng)前導(dǎo)航是否可用的具體方法if(mSDCardPath==null){returnfalse;}Filef=newFile(mSDCardPath,APP_FOLDER_NAME);//給導(dǎo)航主目錄建立名字if(!f.exists()){try{f.mkdirs();//+s是防止出現(xiàn)些問(wèn)題}catch(Exceptione){e.printStackTrace();returnfalse;}returntrue;}Stringauthinfo=null;/***內(nèi)部TTS播報(bào)狀態(tài)回傳handlerprivateHandlerttsHandler=newHandler(){publicvoidhandleMessage(Messagemsg){inttype=msg.what;switch(type){caseBaiduNaviManager.TTSPlayMsgType.PLAY_START_MSG:{//showToastMsg("Handler:TTSplaystart");break;}caseBaiduNaviManager.TTSPlayMsgType.PLAY_END_MSG:{//showToastMsg("Handler:TTSplayend");break;}default:break;}/***內(nèi)部TTS播報(bào)狀態(tài)回調(diào)接口privateBaiduNaviManager.TTSPlayStateListenerttsPlayStateListener=newBaiduNaviManager.TTSPlayStateListener(){@OverridepublicvoidplayEnd(){//showToastMsg("TTSPlayStateListener:TTSplayen");}@OverridepublicvoidplayStart(){//showToastMsg("TTSPlayStateListener:TTSplaystart");publicvoidshowToastMsg(finalStringmsg){MapActivity.this.runOnUiThread(newRunnable(){@Overridepublicvoidrun(){Toast.makeText(MapActivity.this,msg,Toast.LENGTH_SHORT).show();}});}//初始化導(dǎo)航.校驗(yàn)KEY和導(dǎo)航引擎privatevoidinitNavi(){BNOuterTTSPlayerCallbackttsCallback=null;BaiduNaviManager.getInstance().init(this,mSDCardPath,APP_FOLDER_NAME,newBaiduNaviManager.NaviInitListener(){@OverridepublicvoidonAuthResult(intstatus,Stringmsg){if(0==status){authinfo="key校驗(yàn)成功!";}else{authinfo="key校驗(yàn)失敗,"+msg;}MapActivity.this.runOnUiThread(newRunnable(){@Overridepublicvoidrun(){Toast.makeText(MapActivity.this,authinfo,Toast.LENGTH_LONG).show();}});}publicvoidinitSuccess(){Toast.makeText(MapActivity.this,"百度導(dǎo)航引擎初始化成功",Toast.LENGTH_SHORT).show();initSetting();}publicvoidinitStart(){Toast.makeText(MapActivity.this,"百度導(dǎo)航引擎初始化開(kāi)始",Toast.LENGTH_SHORT).show();}publicvoidinitFailed(){Toast.makeText(MapActivity.this,"百度導(dǎo)航引擎初始化失敗",Toast.LENGTH_SHORT).show();}},null,ttsHandler,ttsPlayStateListener);}privatevoidinitSetting(){//設(shè)置是否雙屏顯示BNaviSettingManager.setShowTotalRoadConditionBar(BNaviSettingManager.PreViewRoadCondition.ROAD_CONDITION_BAR_SHOW_ON);//設(shè)置導(dǎo)航播報(bào)模式BNaviSettingManager.setVoiceMode(BNaviSettingManager.VoiceMode.Veteran);//是否開(kāi)啟路況BNaviSettingManager.setRealRoadCondition(BNaviSettingManager.RealRoadCondition.NAVI_ITS_ON);}//判斷當(dāng)前導(dǎo)航是否可用具體方法privateStringgetSdcardDir(){if(Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){returnEnvironment.getExternalStorageDirectory().toString();}returnnull;}初始化成功之后調(diào)用方法放入起止位置開(kāi)始導(dǎo)航。這是實(shí)時(shí)導(dǎo)航頁(yè)面,會(huì)顯示規(guī)劃好的最佳路段、當(dāng)前車(chē)速以及預(yù)計(jì)到達(dá)時(shí)間。實(shí)時(shí)導(dǎo)航界面如圖6-11所示:圖6-11實(shí)時(shí)導(dǎo)航界面模擬導(dǎo)航之后需要正式的導(dǎo)航功能,用戶實(shí)時(shí)的來(lái)規(guī)劃用戶的路線,計(jì)算距離和車(chē)速并進(jìn)行語(yǔ)音播報(bào)實(shí)時(shí)路況,方便用戶提前對(duì)于前方的交通情況提前進(jìn)行了解,模擬導(dǎo)航也有語(yǔ)音播報(bào)功能。關(guān)鍵代碼如下://初始化成功之后調(diào)用起止位置開(kāi)始導(dǎo)航privatevoidrouteplanToNavi(booleanmock){BNRoutePlanNode.CoordinateTypecoType=BNRoutePlanNode.CoordinateType.GCJ02;BNRoutePlanNodesNode=null;BNRoutePlanNodeeNode=null;//坐標(biāo)系轉(zhuǎn)換將bd09ll轉(zhuǎn)換成GCJ02BDLocationdestBdLocation=newBDLocation();destBdLocation.setLatitude(mDestLocationData.latitude);destBdLocation.setLongitude(mLastLocationData.latitude);//起點(diǎn)終點(diǎn)(開(kāi)始)sNode=newBNRoutePlanNode(mLastLocationData.longitude,mLastLocationData.latitude,"我的地點(diǎn)",null,coType);//起點(diǎn)終點(diǎn)(結(jié)束)eNode=newBNRoutePlanNode(mDestLocationData.longitude,mDestLocationData.latitude,"我的終點(diǎn)",null,coType);if(sNode!=null&&eNode!=null){List<BNRoutePlanNode>list=newArrayList<BNRoutePlanNode>();list.add(sNode);list.add(eNode);BaiduNaviManager.getInstance().launchNavigator(this,list,1,mock,newDemoRoutePlanListener(sNode));//falise是模擬導(dǎo)航true是真實(shí)導(dǎo)航}//

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論