版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
JISHOUUNIVERSITY本科生畢業(yè)設(shè)計(jì)題目:基于Android系統(tǒng)的手機(jī)地圖APP學(xué)號:201520078所屬學(xué)院:信息科學(xué)與工程學(xué)院 專業(yè)年級:電子信息工程技術(shù),2013級 指導(dǎo)教師:侯冬晴職稱:副教授 吉首大學(xué)教務(wù)處制 IAbstract II 11.1課題研究的背景和目的 11.2國內(nèi)外研究現(xiàn)狀 11.3研究內(nèi)容和設(shè)計(jì)結(jié)構(gòu) 3第2章課題設(shè)計(jì)相關(guān)技術(shù)概述 42.1開發(fā)語言 42.2Android的架構(gòu) 42.3AndroidSDK 5第3章軟件需求性分析 63.1可行性 63.2需求分析 73.3業(yè)務(wù)流程 7第4章百度Key(密鑰)申請 94.1申請百度密鑰 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)境和開發(fā)平臺 166.2系統(tǒng)開機(jī)閃屏頁面 176.3地圖主界面 186.4實(shí)時(shí)路況界面 226.5視圖界面 236.6搜索界面 256.7導(dǎo)航界面 29第7章地圖上線 367.1預(yù)期測試結(jié)果 367.2實(shí)際測試結(jié)果 36結(jié)束語 38參考文獻(xiàn) 39 40基于Android系統(tǒng)的手機(jī)地圖APPAndroidSDK是一套基于Android2.1及以上版本的移動設(shè)備應(yīng)用接口。在手機(jī)地圖領(lǐng)域做得最好的就當(dāng)數(shù)谷歌地圖和百度地圖了,并且這兩種地圖都提供了豐富的API[1],使得任何開發(fā)者都可以輕松地將地圖功能引入到自己的應(yīng)用程序當(dāng)中。通過調(diào)用地圖SDK接口可以輕松訪問在手機(jī)上訪問百度地圖服務(wù)和數(shù)據(jù),可以構(gòu)建功能豐富、并且交互性強(qiáng)的手機(jī)移動地圖應(yīng)用程序。UI設(shè)計(jì)方面借鑒了百度簡約的設(shè)計(jì)風(fēng)格,簡單明了又不失獨(dú)特。Java開發(fā)語言和最新的AndroidStudio開發(fā)軟件為本應(yīng)用提供了穩(wěn)定環(huán)境及開發(fā)平臺,通過設(shè)計(jì)本應(yīng)用可以提供地圖展示(城市熱力圖、衛(wèi)星地圖、城市實(shí)時(shí)路況信息圖)地圖定位和地圖操作功能,支持城市內(nèi)POI檢索并進(jìn)行Place詳情列表展示,根據(jù)POI檢索結(jié)果和長按地圖設(shè)置目的地的操作會進(jìn)行覆蓋物標(biāo)注從而展示更加豐富的地圖。目前還可以支持百度地圖的調(diào)啟功能包括(駕車導(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課題研究的背景和目的移動互聯(lián)時(shí)代早就已經(jīng)來臨了,說明新的時(shí)代新的技術(shù)已經(jīng)越來越成熟。當(dāng)移動通信和互聯(lián)網(wǎng)結(jié)合在一起之后就形成了我們常說的移動互聯(lián)網(wǎng),我們的源以及需要查找的手機(jī)應(yīng)用軟件,本畢業(yè)設(shè)計(jì)我已經(jīng)上傳到了百度開發(fā)者平臺通過掃描本論文末尾的二維碼即可下載。我們的智能手機(jī)是互聯(lián)網(wǎng)背景下非常具有標(biāo)志性的一個(gè)移動終端以及客戶端的工具,其實(shí)就相當(dāng)于一臺“小型的電腦”,比如android系統(tǒng)就相當(dāng)于它獨(dú)立的操作系統(tǒng),可以安裝和卸載軟件,也可以通過開啟無線網(wǎng)絡(luò)端口自由的接入斷開通信網(wǎng)絡(luò),可以通過SD卡獲得很大的存儲空間和強(qiáng)大的計(jì)算數(shù)據(jù)功能,這就和傳統(tǒng)的手機(jī)有了很大的區(qū)別。在這個(gè)網(wǎng)絡(luò)技術(shù)日新月異的促進(jìn)下,我國在通信技術(shù)領(lǐng)域早已經(jīng)進(jìn)入了第四代,即4G時(shí)代的出現(xiàn),讓我們可以享受到更加快速的網(wǎng)絡(luò)傳輸速度和更智能的手機(jī)移動設(shè)備。現(xiàn)如今手機(jī)成為了我們?nèi)粘I钪斜夭豢缮俚囊坏捞瘘c(diǎn)。隨著現(xiàn)在科技的進(jìn)步人們的生活水平在不斷提升,人們已經(jīng)不用思考柴米油鹽和溫飽問題而開始熱衷于如何提升生活的質(zhì)量,所以普通只可以打電話發(fā)短信的手機(jī)已經(jīng)無法滿足人們的需要了。于是產(chǎn)生了智能手機(jī)。通過相關(guān)調(diào)查研究表明人們對于智能手機(jī)的使用率已經(jīng)達(dá)到了90%以上,智能手機(jī)也被開發(fā)者設(shè)計(jì)得越來越人性化,人們可以通過手機(jī)將完成越來越人性化的功能,可以說智能手機(jī)已經(jīng)成為了人們生活的一部分。隨著越來越多的人通過android來解決問題,現(xiàn)在和地圖相關(guān)的APP在手機(jī)上的應(yīng)用已經(jīng)可以算是非常廣泛了,和傳統(tǒng)電腦PC端的地圖軟件相比之下手機(jī)地圖APP可以具備隨時(shí)隨地查看并且可以非常輕松的規(guī)劃出出行路線并且還能夠進(jìn)行導(dǎo)航,方便度有了明顯的差距。所以我們可以開發(fā)出一款手機(jī)移動端地圖來方便人們的生活。1.2國內(nèi)外研究現(xiàn)狀手機(jī)以及一些其他的移動設(shè)備為人們帶來了越來越多越來越方便的生活,不斷出現(xiàn)的手機(jī)地圖系統(tǒng)的相關(guān)軟件為在外出行的人提供了途徑,節(jié)約了時(shí)間也極大地提高了效率。所以和手機(jī)地圖相關(guān)的研究在學(xué)術(shù)研究中開始慢慢顯現(xiàn)出來了,其中就包括了市場數(shù)據(jù)研究和應(yīng)用數(shù)據(jù)研究。根據(jù)報(bào)告,2015年中國IT研究中心的相關(guān)研究對目前市場上份額排名前幾位的地圖軟件展開了調(diào)查,通過調(diào)查對前幾位的軟件進(jìn)行了排名,根據(jù)結(jié)果顯示,目前百度手機(jī)地圖排名第一,市場份額65.5%,由此可見更多人愿意使用百度地圖來,高德地圖排名第二,市場份額20.1%,搜狗地圖排名第三,市場份額8.4%。15年手機(jī)地圖市場份額如圖1-1所示:圖1-12015年手機(jī)地圖累計(jì)市場份額手機(jī)地圖作為移動互聯(lián)網(wǎng)的重要入口之一,各互聯(lián)網(wǎng)巨頭紛紛加大資源投入力度,展開對手機(jī)地圖市場的爭奪。2014年高德地圖經(jīng)歷了換帥,宣布發(fā)力LBS,專注位置解決方案,打出“你敢用就敢賠”的活動;百度地圖則展開國際化戰(zhàn)略,新提供境外地圖數(shù)據(jù),與相關(guān)地圖合作開放全球定位能力;搜狗地圖成為蘋果官方AppleWatch首批邀請入駐的應(yīng)用。在此背景下,從2015年第1季度中國手機(jī)地圖主要APP的累積用戶數(shù)、活躍用戶數(shù)、用戶關(guān)注度、用戶日均定位請求數(shù)等相關(guān)指標(biāo)說明現(xiàn)在的中國手機(jī)地圖的市場情況。CNIT分析認(rèn)為,手機(jī)地圖市場集中度高。百度地圖、高德地圖和搜狗地圖位列三甲,份額超90%,這和手機(jī)地圖產(chǎn)品特性有關(guān),需相應(yīng)的資質(zhì)才能運(yùn)營,且還需實(shí)時(shí)更新相關(guān)數(shù)據(jù),構(gòu)成一定的技術(shù)門檻。15年中國活躍用戶市場份額如圖1-2所示:圖1-22015年中國活躍用戶市場份額比達(dá)(BigData)數(shù)據(jù)顯示,在2015年Q1中國手機(jī)地圖活躍用戶市場份額中,百度地圖67.9%最高,高德地圖19.7%居第二,搜狗地圖8.5%位第三,另外,騰訊地圖、谷歌地圖2.4%。因此以百度地圖SDK作為載體根據(jù)百度API提供的文檔來進(jìn)行開發(fā)不僅和獲得更加全面的數(shù)據(jù)而且性能無疑是最佳的。1.3研究內(nèi)容和設(shè)計(jì)結(jié)構(gòu)1.地圖的定位和我的位置功能在本地圖APP軟件的設(shè)計(jì)中,用戶通過安裝打開軟件之后立刻會定位到當(dāng)前位置并同時(shí)報(bào)出當(dāng)前位置名稱。并通過添置按鈕設(shè)置相應(yīng)的單擊事件從而在用戶滑動地圖到其他位置后可以通過此按鈕迅速回到當(dāng)前位置。2.方向傳感器和自定義圖標(biāo)我們都知道智能手機(jī)里面內(nèi)置了很多傳感器,例如:方向傳感器、距離傳感器、陀螺儀傳感器以及重力傳感器等。本應(yīng)用通過調(diào)用手機(jī)的方向傳感器從而判斷用戶當(dāng)前機(jī)頭所處方向,通過自定義圖標(biāo)來指示當(dāng)前方向并通過方向的不同實(shí)時(shí)更新圖標(biāo)的方向位置。另外導(dǎo)航部分還將調(diào)用距離傳感器來進(jìn)行算路處理。3.基于城市的地點(diǎn)搜索功能采用下拉列表輸入的方式來設(shè)置城市和搜索類型,從而獲取到周邊地點(diǎn),首先會通過彈窗來顯示出周邊的位置信息,然后通過添加覆蓋物的形式來標(biāo)注出來。4.GPS導(dǎo)航功能本設(shè)計(jì)地圖軟件還提供智能導(dǎo)航功能,當(dāng)前位置是設(shè)置自動默認(rèn)為起點(diǎn),通過長按地圖上面的地點(diǎn)來設(shè)置目的地。同時(shí)會在目的地上面添加覆蓋物來標(biāo)注,設(shè)置完目的地之后點(diǎn)擊“模擬導(dǎo)航或者實(shí)時(shí)導(dǎo)航”,將立刻進(jìn)入導(dǎo)航模式。5.開啟實(shí)時(shí)路況和城市熱力圖以及可以打開衛(wèi)星地圖通過設(shè)置相關(guān)按鈕和相應(yīng)的單擊事件方法,用戶可以通過點(diǎn)擊相應(yīng)的按鈕來獲取到相應(yīng)風(fēng)格的地圖,查看衛(wèi)星地圖要考慮當(dāng)?shù)氐沫h(huán)境和縮放比例。如果發(fā)現(xiàn)當(dāng)前區(qū)域無地圖可以將縮放比例縮小一點(diǎn)。第2章課題設(shè)計(jì)相關(guān)技術(shù)概述2.1開發(fā)語言Java語言作為目前使用排行第一的編程語言不僅具有C++面向?qū)ο蟮奶攸c(diǎn),還根據(jù)“低耦合,高內(nèi)聚”[2]的手機(jī)應(yīng)用程序設(shè)計(jì)特點(diǎn)摒棄了C++里面難以理解的指針和多繼承的特點(diǎn)。因此Java語言就同時(shí)具有了功能強(qiáng)大和簡單易用的特點(diǎn),所以被很多開發(fā)人員采用。Java語言又是一種動態(tài)的編程語言,安全性高、分布式使用非常廣泛而且可跨平臺移植,現(xiàn)在的很多軟件都是用Java語言來進(jìn)行開發(fā)編寫的,手機(jī)、個(gè)人筆記本、平板電腦等終端設(shè)備上面的很多軟件都是通過Java語言的可移植跨平臺的特性才能使用的只需要安Java開發(fā)環(huán)境[3]即可。Java程序具有與體系結(jié)構(gòu)無關(guān)的特性,可以方便地移植到網(wǎng)絡(luò)上的不同計(jì)算機(jī)當(dāng)中。編程語言排行榜如圖2-1所示:圖2-1編程語言排行榜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)行庫層、Linux內(nèi)核層。Android系統(tǒng)的核心服務(wù)是基于Linux2.6內(nèi)核的,這一層主要功能是讓開發(fā)者編寫底層程序從而為Android手機(jī)以及基于Android的設(shè)備的各種硬件設(shè)施提供底層驅(qū)動,比如為藍(lán)牙相機(jī)、無線網(wǎng)絡(luò)(WIFI)、電源設(shè)備、音頻、顯示器等進(jìn)行驅(qū)動。2.系統(tǒng)運(yùn)行庫層這一層主要是為Android系統(tǒng)提供各種特性支持,比如數(shù)據(jù)庫可以直接通過SQLite庫來提供(也可以使用外部數(shù)據(jù)庫如:MySQL3D繪圖支持可以通過OpenGL/ES庫提供,瀏覽器內(nèi)核可以通過Webkit庫來提供等。同樣還有一個(gè)運(yùn)行時(shí)庫,它包含一個(gè)核心庫,可以讓開發(fā)者運(yùn)用Java語言來編寫Android應(yīng)用。另外Android的運(yùn)行都是可以通過Dalvik虛擬機(jī)來進(jìn)行,且都是獨(dú)立運(yùn)行進(jìn)程。另外也可以通過真機(jī)來運(yùn)行??偟膩碚f相對于Java虛擬機(jī)來說,Dalvik針對于移動設(shè)備并且完全模擬手機(jī)還能夠針對手機(jī)內(nèi)存以及CPU來進(jìn)行優(yōu)化處理。3.應(yīng)用框架層組件也就是API。需要用來開發(fā)Android應(yīng)用程序的工具都具備之后,Google為了大力推廣Android,也希望所有應(yīng)用程序開發(fā)者可以順利地轉(zhuǎn)移到Android平臺,因此創(chuàng)建了一系列的應(yīng)用程序架構(gòu)[5]。應(yīng)用程序的架構(gòu)主要是為了簡化程序組件的重用,從而在遵循框架安全性的前提下快速的的開發(fā)應(yīng)用程??梢赃M(jìn)行視圖(views)擴(kuò)展、優(yōu)化、添加列表(lists)、按鈕(buttons)、文本框(textboxes甚至可以嵌入web瀏覽器。另外還包括四大組件分別是活動(Activity)、服務(wù)(Service)、廣播接收器(BroadcastReceiver)和內(nèi)容提供器(ContentProvider)。4.應(yīng)用層這一層顧名思義就是手機(jī)上面的應(yīng)用程序所在的這一層,比如系統(tǒng)自帶的通訊錄、短信、聯(lián)系人等,自己網(wǎng)上下載或者進(jìn)行自己開發(fā)的應(yīng)用程序的真機(jī)測試應(yīng)用。Android平臺包括一些系統(tǒng)資源,所有的資源都可以直接從你的應(yīng)用程序代碼和使用。也可以從內(nèi)部引用的其他資源。例如,一個(gè)維度中[6]引用資源可能布局的定義。2.3AndroidSDKSDK:軟件開發(fā)工具包。比如百度地圖SDK、ShareSDK等是在特定軟件開發(fā)過程中,開發(fā)者用相應(yīng)的軟件開發(fā)工具包來進(jìn)行特定的開發(fā)工作。AndroidSDK[7]以Java語言為基礎(chǔ),用戶可以使用Java來開發(fā)來開發(fā)Android平臺的應(yīng)用軟件。也是軟件開發(fā)工具包,用于提供Android系統(tǒng)的不同版本的開發(fā)所需要的環(huán)境以及工具。在搭建硬件平臺以及軟件開發(fā)的框架時(shí)都需要通過引入該工具包,才能使用Android開發(fā)相關(guān)的API。第3章軟件可行性及需求分析3.1可行性軟件開發(fā)過程中,不僅僅是考慮能不能用技術(shù)實(shí)現(xiàn)出來而是要全面性的來根據(jù)可行性考慮,軟件能否成功開發(fā)不僅僅需要足夠的技術(shù)還得要有經(jīng)濟(jì)和法律方面的考慮。下面就從技術(shù)、經(jīng)濟(jì)、法律三個(gè)方面來分析。1.技術(shù)是否可行?本課題的這款手機(jī)定位APP的設(shè)計(jì)實(shí)現(xiàn)最主要還是與程序設(shè)計(jì)相關(guān),因此程序開發(fā)語言尤其重要,并且這種語言開發(fā)的應(yīng)用必須能夠在Android手機(jī)上面安裝運(yùn)行。所以目前來說現(xiàn)階段的開發(fā)語言當(dāng)中,Java語言和C語言等已經(jīng)面世并且相對來說比較成熟和穩(wěn)定的開發(fā)語言,像GO語言雖然是屬于最新出來編程語言但本身還不夠穩(wěn)定優(yōu)點(diǎn)和缺點(diǎn)一樣明顯所以還得選擇技術(shù)相對成熟的語言。還有在導(dǎo)航和定位的過程中需要不斷的訪問網(wǎng)絡(luò)數(shù)據(jù)來獲取當(dāng)前位置和加載地圖,所以隨著我國第四代網(wǎng)絡(luò)的出現(xiàn)已經(jīng)完全能夠滿足手機(jī)定位APP的開發(fā)實(shí)現(xiàn)。操作系統(tǒng):win7;開發(fā)工具:AndroidStudio、phtoshopcs6;開發(fā)包:百度地圖SDK、jdk1.8.0;2.經(jīng)濟(jì)是否可行?Android開發(fā)者和工程師開發(fā)軟件最終都是需要獲得收益,所以在真正開發(fā)過程中也需要投入相應(yīng)的資金才能保證效果,但是從百度地圖開發(fā)的情況下來看SDK工具包可以直接到百度地圖API網(wǎng)址上面在免費(fèi)下載,開發(fā)人員也不需要很多。實(shí)際上在美工、UI布局、上線都是本人完成的。而且我也不需要盈利,因此從這兩方面來說經(jīng)濟(jì)上面完全沒有問題。3.法律可行?本課題設(shè)計(jì)的基于百度地圖的手機(jī)定位APP,僅僅用于學(xué)習(xí)和做畢業(yè)設(shè)計(jì)。不做任何盈利用途,因此在法律上面沒有任何問題,完全可行。3.2需求分析軟件工程創(chuàng)建之前首先必須先進(jìn)行需求分析,這樣畢竟能夠明確開發(fā)目的和方向還能夠進(jìn)行更加人性化科學(xué)的設(shè)計(jì)出來,有時(shí)候還能減小內(nèi)存空間提升軟件運(yùn)行效率。否則,不僅開發(fā)的時(shí)候不太明確實(shí)際開發(fā)意圖和方向。而且無法從使用者角度去考慮問題,不實(shí)用的功能只會給開發(fā)造成很大的負(fù)擔(dān)和資源浪費(fèi)。因此,在開發(fā)的過程中一定要充分考慮使用者的需求,不僅是在這次基于百度地圖定位的APP開發(fā)所有的在Android系統(tǒng)上開發(fā)的app都要遵循和體現(xiàn)使用者基本的需求。通過分析用戶的大致需求如下:可以根據(jù)當(dāng)前城市名查詢周邊的地點(diǎn),美食、酒店、學(xué)校、醫(yī)院等;可以能夠查看實(shí)時(shí)路況地圖、城市熱力地圖、衛(wèi)星地圖等三種不同的使用模式;可以在滑動地圖查找地點(diǎn)的之后點(diǎn)擊當(dāng)前按鈕迅速回到當(dāng)前位置;可以根據(jù)方向傳感器的數(shù)據(jù)實(shí)時(shí)辨別當(dāng)前方向,開啟羅盤模式之后更加直觀;可以通過長按設(shè)置目的地并且添加標(biāo)識;可以進(jìn)行模擬導(dǎo)航用來快速實(shí)時(shí)查看當(dāng)前路況;可以開啟實(shí)時(shí)導(dǎo)航地圖會自動規(guī)劃出最優(yōu)線路,在駕車過程中計(jì)算車速和距離以及預(yù)計(jì)到達(dá)時(shí)間,最后完成導(dǎo)航。3.3地圖系統(tǒng)運(yùn)行的功能架構(gòu)在實(shí)際工作過程中,經(jīng)常需要介紹業(yè)務(wù)運(yùn)行流程。而業(yè)務(wù)運(yùn)行流程則由特定的圖形和符號來表示地圖系統(tǒng)運(yùn)行的功能架構(gòu),不僅可以用來分析軟件整理和接受結(jié)果的過程,還可以更加直觀的發(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(密鑰)申請4.1申請百度密鑰百度地圖SDK是一套基于Android2.1及以上版本的應(yīng)用程序設(shè)備接口。通過該接口開發(fā)者才能使用百度地圖SDK的各項(xiàng)功能,并且使用無次數(shù)限制。在使用百度地圖SDK的各項(xiàng)LBS功能之前,必須先獲得百度地圖的密鑰。非營利項(xiàng)目可以直接使用。首先注冊并登錄百度賬號,搜索并進(jìn)入“百度地圖API”官網(wǎng)。可以先選擇“Android開發(fā)”了解一下也可以直接點(diǎn)擊“申請密鑰”。百度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)入控制臺第2步:定位到.android文件夾下,輸入cd.android第3步:輸入keytool-list-v-keystoredebug.keystore,會得到三種指紋證書,選取SHA1類型的證書(密鑰口令是android例如:其中keytool為jdk自帶工具;keystorefile為Android簽名證書文件配置完成后點(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ò)誤將會導(dǎo)致定位和地理圍欄服務(wù)無法正常使用。設(shè)置AK就是在Application標(biāo)簽中加入開發(fā)者申請的Key:<!--在application中添加開發(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)用,是有開機(jī)閃屏頁之后才正式跳轉(zhuǎn)到地圖頁面(首次啟動還會有開機(jī)引導(dǎo)頁,由于圖片太多容易造成內(nèi)存泄漏并且也為了減少軟件大小就舍棄了)。而地圖頁面作為前臺讓用戶根據(jù)自己的需求來使用地圖,能夠進(jìn)行周邊查詢。選擇喜歡的使用模式、查看當(dāng)前方向以及一些導(dǎo)航操作。為了充分考慮簡潔性和方便性本人參考了下百度地圖的頁面設(shè)計(jì),盡量看起來賞心悅目。地圖根據(jù)功能在前臺一一添加按鈕,主要功能包括根據(jù)城市名和搜索類型來搜索周邊地點(diǎn);用戶可以選擇自己喜歡的使用模式:衛(wèi)星地圖、實(shí)況交通、城市熱力圖;用戶可以在滑動地圖查找地點(diǎn)之后通過定位按鈕重新回到當(dāng)前地圖中心位置;啟動方向羅盤來辨別方向;還調(diào)用了方向傳感器來動態(tài)實(shí)時(shí)更新箭頭位置方向十分靈敏;該系統(tǒng)還能夠設(shè)置目的地來進(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)限方案來保護(hù)設(shè)備上的資源和功能。例如,在默認(rèn)情況下,應(yīng)用程序無法訪問聯(lián)系人列表、撥打電話、發(fā)送短信等。下面就是本應(yīng)用中需要用到和可能需要用到的權(quán)限。當(dāng)我們不確定是否需要這個(gè)權(quán)限的時(shí)候盡量還是選擇添加,畢竟不會影響軟件的使用而且還能提高軟件的兼容性。權(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)限用于訪問GPS定位--><uses-permissionandroid:name="android.Permission.ACCESS_FINE_LOCATION"/><!--用于訪問wifi網(wǎng)絡(luò)信息,wifi信息會用于進(jìn)行網(wǎng)絡(luò)定位--><uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/><!--獲取運(yùn)營商信息,用于支持提供運(yùn)營商信息相關(guān)的接口--><uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/><!--這個(gè)權(quán)限用于獲取wifi的獲取權(quán)限,wifi信息會用來進(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"/><!--寫入擴(kuò)展存儲,向擴(kuò)展卡寫入數(shù)據(jù),用于寫入離線定位數(shù)據(jù)--><uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!--訪問網(wǎng)絡(luò),網(wǎng)絡(luò)定位需要上網(wǎng)--><uses-permissionandroid:name="android.Permission.INTERNET"/><!--SD卡讀取權(quán)限,用戶寫入離線定位數(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"/><!--來電消音--><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的接口,而百度也因此為我們開發(fā)者提供了十分便捷的百度地圖顯示接口,通過以下幾步我們就可以在應(yīng)用中使用百度地圖的所用數(shù)據(jù)了。Service(服務(wù))[8]是能夠在后臺執(zhí)行長時(shí)間運(yùn)行操作并且不提供用戶界面的應(yīng)用程序組件。其他應(yīng)用程序組件能啟動服務(wù),并且即便用戶切換到另一個(gè)應(yīng)用程序,服務(wù)還可以在后臺運(yùn)行。第一步,在application標(biāo)簽中聲明service組件:<!--在application標(biāo)簽中聲明service組件,每個(gè)app擁有自己單獨(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)建地圖的活動(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)境和開發(fā)平臺系統(tǒng)開發(fā)及運(yùn)行環(huán)境和硬件信息如表1所示:表1系統(tǒng)開發(fā)及運(yùn)行環(huán)境和硬件信息表硬件名稱硬件詳細(xì)信息CPUCore?i3.2.40GHz及以上配置4G及以上配置硬盤500G及以上配置顯示器分辨率在1366×768像素及以上網(wǎng)絡(luò)1M及以上操作系統(tǒng)Windows764位/32位開發(fā)工具AndroidStudio1.5、photoshopcs6圖6-1開機(jī)閃屏頁6.2系統(tǒng)開機(jī)閃屏頁面6-1所示:關(guān)鍵代碼如下://在注冊事件方法中設(shè)置3秒后啟動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)前界面跳到要開啟的界面startActivity(newIntent(SplashActivity.this,MapActivity.class));}6.3地圖主界面這是開機(jī)完成后的地圖主界面,打開地圖之后。自動開啟方向傳感器和定位,同時(shí)打開羅盤俯瞰模式(3秒后退出到時(shí)會保持俯瞰)。在此頁面用戶可以搜索、定位、切換模式等需要的操作。地圖主界面如圖6-2所示:圖6-2地圖主界面6.3.1設(shè)置請求定位信息開啟軟件之后軟件會自動定位到當(dāng)前位置,當(dāng)滑動地圖之后也可以點(diǎn)擊“我的”按鈕,重新定位到當(dāng)前位置并顯示到地圖中央。關(guān)鍵代碼如下:privateclassMyLocationListnerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){//定位成功回調(diào)函數(shù)//mapview銷毀后不再處理新的接收位置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);//地圖的位置使用動畫效果轉(zhuǎn)過去mLastLocationData=latLng;//記錄起點(diǎn)位置isFirstIn=false;//將位置報(bào)出來。Toast.makeText(context,location.getAddrStr(),Toast.LENGTH_SHORT).show();}}6.3.2定位監(jiān)聽器/配置事件監(jiān)聽器地圖應(yīng)用需要進(jìn)行初始設(shè)置以便能讓用戶打開軟件之后就能獲得比較好的體驗(yàn),例如:國際經(jīng)緯度坐標(biāo)標(biāo)準(zhǔn)為WGS-84,國內(nèi)必須至少使用國測局制定的GCJ-02,對地理位置進(jìn)行首次加密。百度坐標(biāo)在此基礎(chǔ)上,進(jìn)行了BD-09二次加密措施,更加保護(hù)了個(gè)人隱私。百度對外接口的坐標(biāo)系并不是GPS采集的真實(shí)經(jīng)緯度,需要通過坐標(biāo)轉(zhuǎn)換接口進(jìn)行轉(zhuǎn)換等。另外地圖的精度也可以設(shè)置并可以通過設(shè)置定位請求時(shí)間,以及初始化方向傳感器。關(guān)鍵代碼如下:privatevoidinitLocation(){mLocationMode=MyLocationConfiguration.LocationMode.COMPASS;//模式切換mLocationClient=newLocationClient(this);//聲明定位監(jiān)聽器myLocationListner=newMyLocationListner();//實(shí)例化定位監(jiān)聽器mLocationClient.registerLocationListener(myLocationListner);//注冊定位監(jiān)聽器//配置事件監(jiān)聽器LocationClientOptionoption=newLocationClientOption();//可選,默認(rèn)高精度,設(shè)置定位模式,高精度option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);option.setCoorType("bd09ll");//定義地圖坐標(biāo)系option.setIsNeedAddress(true);//返回的位置結(jié)果包含地址信息option.setOpenGps(true);//開啟GPSoption.setScanSpan(1000);//每隔1秒·請求定位一次//option.setNeedDeviceDirect(true);//定位結(jié)果包含機(jī)頭方向mLocationClient.setLocOption(option);//必須設(shè)置否者無法監(jiān)聽mLocationClient.start();//啟動SDK定位mLocationClient.requestLocation();//發(fā)送請求//初始化定位圖標(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è)置開啟和關(guān)閉定位定位開啟之后當(dāng)然需要能夠關(guān)閉不能夠一直定位,這樣用戶肯定是不能接受的,因此我們就需要既能夠開啟定位又能夠關(guān)閉定位,以及方向傳感器的開啟和關(guān)閉。關(guān)鍵代碼如下:定位完成之后需要退出所以(onstop,onstar)@OverrideprotectedvoidonStart(){super.onStart();mBaiduMap.setMyLocationEnabled(true);//是否允許開啟定位//進(jìn)行判斷是否啟動if(!mLocationClient.isStarted())mLocationClient.start();//開啟定位}@OverrideprotectedvoidonStop(){super.onStop();mBaiduMap.setMyLocationEnabled(false);//不允許開啟定位mLocationClient.stop();}6.3.4方向傳感器Android系統(tǒng)的一大亮點(diǎn)之一就是對傳感器[9]的應(yīng)用,利用傳感器可以開發(fā)出很多新奇有趣的程序,小到水平儀、計(jì)步器,大到傳感器游戲,這里是地圖應(yīng)用的方向傳感器功能就是當(dāng)轉(zhuǎn)動手機(jī)的時(shí)候,地圖上顯示個(gè)人所在位置的圖標(biāo)的箭頭變動,傳感器隨著定位的開始而開啟,隨著定位的結(jié)束而結(jié)束傳感器獲得位置的移動而更新方向。關(guān)鍵代碼如下://開始監(jiān)聽@SuppressWarnings("deprecation")publicvoidstart(){//通過傳感器管理者拿到傳感器mSensorManager=(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);//判斷是否開啟傳感器管理者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)聽publicvoidstop(){//移除監(jiān)聽停止定位mSensorManager.unregisterListener(this);}6.3.5檢測當(dāng)方向發(fā)生改變時(shí)這里的思路是和指南針?biāo)悸穂10]是一樣的:程序先準(zhǔn)備一張指南針圖片,該圖片上方指針指向北方。然后檢測和接收傳感器在更新圖層從而達(dá)到改變方向的效果。關(guān)鍵代碼如下://判斷返回傳感器類型是否為方向傳感器if(event.sensor.getType()==Sensor.TYPE_ORIENTATION){floatx=event.values[SensorManager.DATA_X];//判斷方向與最新的x進(jìn)行比對從而做出改變//只要偏差大于1.0就會通知主界面更新if(Math.abs(x-lastX)>1.0){if(mOnOrientationListener!=null){mOnOrientationListener.onOrientationChenged(x);}}lastX=x;//最后將新的x值傳過來}6.4實(shí)時(shí)路況界面這是地圖實(shí)時(shí)路況界面,點(diǎn)擊“路況”按鈕之后就開始實(shí)時(shí)查看目前為止的路況信息,綠色表示此路段暢通、黃色表示此路段緩行、紅色表示此路段擁堵如果為灰色則表示此路段無信息。實(shí)時(shí)路況界面如圖6-3所示:圖6-3實(shí)時(shí)路況界面關(guān)鍵代碼如下(按鈕單擊事件部分):caseR.id.id_map_traffic://實(shí)時(shí)交通//做一個(gè)判斷如果當(dāng)前已經(jīng)是交通圖,點(diǎn)擊會關(guān)閉。否則打開交通圖if(mBaiduMap.isTrafficEnabled()){mBaiduMap.setTrafficEnabled(false);//.setTitle("實(shí)時(shí)交通(off)");}else{mBaiduMap.setTrafficEnabled(true);//item.setTitle("實(shí)時(shí)交通(on)");}break;6.5視圖界面這是視圖模式界面,通過點(diǎn)擊屏幕上的“衛(wèi)星圖標(biāo)”可以查看2D平面圖、3D俯瞰圖。還可以根據(jù)需求切換為衛(wèi)星圖的2D、3D模式。6.5.1衛(wèi)星地圖界面這是衛(wèi)星地圖界面,通過點(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城市熱力圖界面這是城市熱力圖通過點(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é)果頁面,通過選擇城市名和搜索類型再點(diǎn)擊“搜索”按鈕就可以查找城市內(nèi)搜索信息,同時(shí)還可以通過彈窗顯示出來并在地圖上添加“覆蓋物”進(jìn)行標(biāo)注。搜索類型包括:美食、學(xué)校、酒店、醫(yī)院、銀行等。搜索界面及搜索結(jié)果彈窗界面和搜索結(jié)果標(biāo)注界面如圖6-6、圖6-7和圖6-8所示:圖6-6搜索界面這是通過下拉列表的方式來存儲城市名和搜索類型從而可以避免輸入錯(cuò)誤而導(dǎo)致軟件崩潰的情況發(fā)生。關(guān)鍵代碼如下://每次搜索前先前sb中的內(nèi)容清空sb=newStringBuilder();//輸入正確城市名和關(guān)鍵字StringcityWord=spinner_city.getSelectedItem().toString();StringkeyWord=spinner_keyword.getSelectedItem().toString();//發(fā)起檢索請求poiSearch.searchInCity((newPoiCitySearchOption()).city(cityWord).pageNum(10).keyword(keyWord));圖6-7搜索結(jié)果彈窗界面當(dāng)啟動搜索之后,搜索結(jié)果的POI信息當(dāng)然能夠顯示出來是最好的,所以我采用了彈窗的方式來顯示搜索結(jié)果的POI信息,因?yàn)橄拗扑灾荒茏疃囡@示10條信息。關(guān)鍵代碼如下://通過AlertDialog顯示當(dāng)前頁搜索到的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)注出來,因此可以采用添加覆蓋物的方式來進(jìn)行標(biāo)注,這里我采用的是紅色位置圖標(biāo)。關(guān)鍵代碼如下://poi實(shí)例化poiSearch=PoiSearch.newInstance();//創(chuàng)建POI檢索的監(jiān)聽事件OnGetPoiSearchResultListenerpoiListener=newOnGetPoiSearchResultListener(){@OverridepublicvoidonGetPoiResult(PoiResultpoiResult){//獲取POI檢索結(jié)果if(poiResult==null||poiResult.error==SearchResult.ERRORNO.RESULT_NOT_FOUND){//沒有檢索到信息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來設(shè)置經(jīng)緯度)OverlayOptionsoptions=newMarkerOptions().position(p.location).icon(bd);//在地圖上添加進(jìn)來mBaiduMap.addOverlay(options);//添加每次搜索到POI信息的名稱sb.append("名稱:").append().append("\n");}//通過AlertDialog顯示當(dāng)前頁搜索到的POInewAlertDialog.Builder(MapActivity.this).setTitle("搜索到的POI信息").setMessage(sb.toString()).setPositiveButton("關(guān)閉",newDialogInterface.OnClickListener(){@OverridepublicvoidonClick(DialogInterfacedialog,intwhich){dialog.dismiss();}}).create().show();}}@OverridepublicvoidonGetPoiDetailResult(PoiDetailResultpoiDetailResult){//獲取Place詳情頁檢索結(jié)果}@OverridepublicvoidonGetPoiIndoorResult(PoiIndoorResultpoiIndoorResult){//設(shè)置POI檢索監(jiān)聽者poiSearch.setOnGetPoiSearchResultListener(poiListener);6.7導(dǎo)航界面這是導(dǎo)航界面通過長按地圖來設(shè)置目的地同時(shí)會用覆蓋物標(biāo)注出來,通過設(shè)置目的地再點(diǎn)擊:“模擬”和“實(shí)時(shí)”按鈕即可實(shí)施相應(yīng)的導(dǎo)航功能。適用于車載導(dǎo)航。6.7.1通過長按地圖設(shè)置目的地,并添加標(biāo)識。設(shè)置目的地界面如圖6-9所示:圖6-9設(shè)置目的地界面當(dāng)用戶需要導(dǎo)航的時(shí)候,可以通過長按地圖上面的目的地來進(jìn)行設(shè)置。并且軟件會將用戶的目的地通過添加終點(diǎn)覆蓋物“圖標(biāo)”的方式標(biāo)識出來。關(guān)鍵代碼如下://設(shè)置地圖的長按事件mBaiduMap.setOnMapLongClickListener(newBaiduMap.OnMapLongClickListener(){@OverridepublicvoidonMapLongClick(LatLnglg){Toast.makeText(MapActivity.this,"設(shè)置目的地成功",Toast.LENGTH_SHORT).show();mDestLocationData=lg;addDestInfoOverlay(lg);//設(shè)置調(diào)用事件});//長按事件方法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)航界面,通過點(diǎn)擊“模擬導(dǎo)航”按鈕用戶可以進(jìn)行路線的全程模擬從而更加詳細(xì)了解規(guī)劃路線的目前為止(當(dāng)前)的路況信息。模擬導(dǎo)航界面如圖6-10所示:圖6-10模擬導(dǎo)航界面因?yàn)橛脩粼O(shè)置目的地之后肯定也不太清楚當(dāng)前自駕車路線的實(shí)際路況情況,所以這里提供了一個(gè)模擬導(dǎo)航功能,可以讓用戶提前了解到路線的路況信息(多少個(gè)彎道、紅綠燈等)。提前來熟悉道路情況。關(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)些問題}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)航引擎初始化開始",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);//是否開啟路況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)用方法放入起止位置開始導(dǎo)航。這是實(shí)時(shí)導(dǎo)航頁面,會顯示規(guī)劃好的最佳路段、當(dāng)前車速以及預(yù)計(jì)到達(dá)時(shí)間。實(shí)時(shí)導(dǎo)航界面如圖6-11所示:圖6-11實(shí)時(shí)導(dǎo)航界面模擬導(dǎo)航之后需要正式的導(dǎo)航功能,用戶實(shí)時(shí)的來規(guī)劃用戶的路線,計(jì)算距離和車速并進(jìn)行語音播報(bào)實(shí)時(shí)路況,方便用戶提前對于前方的交通情況提前進(jìn)行了解,模擬導(dǎo)航也有語音播報(bào)功能。關(guān)鍵代碼如下://初始化成功之后調(diào)用起止位置開始導(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)(開始)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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 比粗細(xì)課件教學(xué)課件
- 2024健身房與會員之間的會員服務(wù)合同
- 2024年建筑工人勞務(wù)雇傭協(xié)議
- 2024年度藝人非獨(dú)家合作合同及演出安排
- 2024年廣告發(fā)布與媒體推廣合同
- 2024年度廢舊物資回收利用合同的履行
- 2024年度技術(shù)研發(fā)計(jì)算機(jī)軟件開發(fā)合同
- 制作高端課件教學(xué)課件
- 04年數(shù)據(jù)中心運(yùn)維服務(wù)合同
- 2024年廢棄物處理服務(wù)合同(含危險(xiǎn)廢物)
- 一年級上冊校本課程教案
- 新能源汽車構(gòu)造 課件 2-3 拆裝動力電池總成
- 傳承農(nóng)耕文化,深化勞動教育三篇模板05.24
- 消防員職業(yè)調(diào)查報(bào)告
- ISO14064-1 2018溫室氣體第1部組織層面上溫室氣體排放與清除量化及報(bào)告規(guī)范
- 便利店帶煙證轉(zhuǎn)讓合同范本
- DZ∕T 0227-2010 地質(zhì)巖心鉆探規(guī)程(正式版)
- 2024年遼寧醫(yī)藥職業(yè)學(xué)院單招職業(yè)適應(yīng)性測試題庫必考題
- 2024中國郵政集團(tuán)限公司云南省分公司招聘158人公開引進(jìn)高層次人才和急需緊缺人才筆試參考題庫(共500題)答案詳解版
- SYT 0452-2021 石油天然氣金屬管道焊接工藝評定-PDF解密
- 教育研究方法觀察設(shè)計(jì)案例
評論
0/150
提交評論