android跑步應(yīng)用開(kāi)發(fā)_第1頁(yè)
已閱讀1頁(yè),還剩34頁(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)介

1、<p><b>  河北農(nóng)業(yè)大學(xué)</b></p><p>  本科畢業(yè)論文(設(shè)計(jì))</p><p>  題 目: Android跑步應(yīng)用開(kāi)發(fā) </p><p>  學(xué) 院: 信息科學(xué)與技術(shù)學(xué)院 </p><p>  專(zhuān)業(yè)班級(jí): 計(jì)算機(jī)1001班 </p&g

2、t;<p>  學(xué) 號(hào): 2010234040931 </p><p>  學(xué)生姓名: 袁偲琦 </p><p>  指導(dǎo)教師姓名: 王 超 </p><p>  指導(dǎo)教師職稱(chēng): 講 師 </p><p&

3、gt;  二O一四 年 六 月 一 日</p><p><b>  目錄</b></p><p><b>  1 緒論1</b></p><p>  1.1 研究背景與意義1</p><p>  1.2 國(guó)內(nèi)外研究現(xiàn)狀1</p><p>  1.3 研究?jī)?nèi)容與目標(biāo)

4、2</p><p>  2 理論技術(shù)基礎(chǔ)2</p><p>  2.1 理論基礎(chǔ)2</p><p>  2.1.1. 系統(tǒng)內(nèi)核2</p><p>  2.1.2. 后綴簡(jiǎn)介2</p><p>  2.1.3. 硬件抽像層3</p><p>  2.1.4. 中介軟件4</p&

5、gt;<p>  2.1.5. 安全權(quán)限機(jī)制4</p><p>  2.1.6. 百度地圖定位5</p><p>  2.2 技術(shù)基礎(chǔ)5</p><p>  3 系統(tǒng)分析與設(shè)計(jì)6</p><p>  3.1 需求分析6</p><p>  3.1.1. 編寫(xiě)目的6</p><

6、;p>  3.1.2. 術(shù)語(yǔ)定義 7</p><p>  3.2 總體設(shè)計(jì)7</p><p>  3.2.1. 系統(tǒng)功能7</p><p>  3.2.2. 軟件結(jié)構(gòu)8</p><p>  3.2.3. 程序流程圖8</p><p>  3.3 詳細(xì)設(shè)計(jì)9</p><p&

7、gt;  3.3.1. 總體界面設(shè)計(jì)9</p><p>  3.3.2. 模塊功能設(shè)計(jì)10</p><p><b>  4 系統(tǒng)實(shí)現(xiàn)11</b></p><p>  4.1 主要界面11</p><p>  4.2 代碼結(jié)構(gòu)13</p><p>  4.3 開(kāi)發(fā)過(guò)程遇到的問(wèn)題20<

8、;/p><p><b>  5 總結(jié)21</b></p><p><b>  參考文獻(xiàn)22</b></p><p><b>  附錄24</b></p><p><b>  摘要</b></p><p>  現(xiàn)在幾乎每個(gè)人都有移動(dòng)

9、設(shè)備,而隨著科技的進(jìn)步,移動(dòng)設(shè)備已經(jīng)不僅僅是通訊工具,也成為了人們手中的玩物,甚至成為一些其他的工具,而各種各樣的移動(dòng)應(yīng)用出現(xiàn)在市場(chǎng)上,人們對(duì)移動(dòng)應(yīng)用的需求也漸漸增大。隨著人們對(duì)健康生活方式的追求,他們對(duì)一些健康類(lèi)應(yīng)用的需求也越來(lái)越大。</p><p>  本論文從學(xué)習(xí)、研究和探討的角度,介紹了Android開(kāi)發(fā)的現(xiàn)狀以及Android開(kāi)發(fā)未來(lái)的發(fā)展趨勢(shì),然后以本系統(tǒng)為例從需求分析、應(yīng)用技術(shù)、設(shè)計(jì)架構(gòu)思想、系統(tǒng)詳

10、細(xì)模塊實(shí)現(xiàn)上分別敘述了它的各種技術(shù)原理及實(shí)現(xiàn)方案,進(jìn)而簡(jiǎn)單的闡明了Android開(kāi)發(fā)以及百度地圖API使用的相關(guān)技術(shù)。然后以本系統(tǒng)為例從需求分析、應(yīng)用技術(shù)、設(shè)計(jì)架構(gòu)思想、數(shù)據(jù)庫(kù)設(shè)計(jì)、系統(tǒng)詳細(xì)模塊實(shí)現(xiàn)上分別敘述了它的各種技術(shù)原理及實(shí)現(xiàn)方案,進(jìn)而簡(jiǎn)單的闡明了開(kāi)發(fā)一個(gè)基于Android的健康類(lèi)應(yīng)用開(kāi)發(fā)的相關(guān)技術(shù)。</p><p>  關(guān)鍵字:Android開(kāi)發(fā)、百度地圖API</p><p>&

11、lt;b>  ABSTRACT</b></p><p>  Now almost everyone has a mobile device, and with the progress of science and technology, the mobile device is not just a communication tool, has also become a plaything

12、 in the hands of the people, even as some of the other tools, and a variety of mobile applications appear on the market, people on the move should use demand also gradually increase. In the pursuit of a healthy lifestyle

13、, their demand for some health class application is also more and more big.</p><p>  In this paper, from the study, research and on the point of view, the future development trend of Android development and

14、the development of Android, and then take this system as the example with module from requirement analysis, application technology, design thought, system realization principle of various techniques are described and its

15、 implementation scheme, and then simply explained Android development and related technology Baidu map using API. And then take this system as the example wit</p><p>  KeyWords:Android Develope 、Baidu Map AP

16、I</p><p><b>  緒論</b></p><p><b>  研究背景與意義</b></p><p>  Android曾經(jīng)是一家創(chuàng)立于舊金山的公司的名字,該公司于2005年8月份被Google收購(gòu),并從此踏上了飛速發(fā)展的道路。經(jīng)過(guò)這幾年的發(fā)展,它已經(jīng)發(fā)展成了一個(gè)平臺(tái)、一個(gè)生態(tài)體系?,F(xiàn)在Android在移動(dòng)領(lǐng)域

17、已經(jīng)得到了廣泛的應(yīng)用。根據(jù)Google于2011年6月份公布的數(shù)字,每天激活的Android設(shè)備高達(dá)50萬(wàn)臺(tái),今天,施密特再次更新了這一數(shù)據(jù)——現(xiàn)在,每天被激活的Android設(shè)備數(shù)量達(dá)到了150萬(wàn)份。谷歌安卓系統(tǒng)負(fù)責(zé)人桑德?tīng)?#183;湃柴(Sundar Pichai)2013年09月宣布,采用安卓移動(dòng)操作系統(tǒng)設(shè)備的激活量已經(jīng)超過(guò)10億臺(tái)。在全球銷(xiāo)售的智能手機(jī)中,有四分之三采用安卓操作系統(tǒng),并且有越來(lái)越多的平板電腦采用這個(gè)操作系統(tǒng)。

18、</p><p>  相比于Symbian的日落西山,以及蘋(píng)果的封閉、Windows Phone的前途未卜,Android無(wú)疑代表了當(dāng)前行業(yè)發(fā)展的主流趨勢(shì):開(kāi)放平臺(tái)取代了封閉平臺(tái)。讓參與者均能通過(guò)自己的努力而獲益。</p><p>  從2008年9月公布1.0版本以來(lái),經(jīng)過(guò)近幾年的跨越式發(fā)展,現(xiàn)在Android已經(jīng)發(fā)展到了4.4版本。2013年9月4日凌晨,谷歌對(duì)外公布了Android新

19、版本Android 4.4KitKat(奇巧巧克力),并且于2013年11月01日正式發(fā)布,新的4.4系統(tǒng)更加整合了自家服務(wù),力求防止安卓系統(tǒng)繼續(xù)碎片化、分散化。目前市場(chǎng)上占主流的并不是4.4版本,當(dāng)然,相信隨著時(shí)間的推移,4.4及后續(xù)版本會(huì)得到越來(lái)越多的設(shè)備的支持。</p><p><b>  國(guó)內(nèi)外研究現(xiàn)狀</b></p><p>  目前國(guó)內(nèi)的Android開(kāi)發(fā)

20、還是主要以應(yīng)用開(kāi)發(fā)為主,主要分成3類(lèi):為企業(yè)開(kāi)發(fā)應(yīng)用、開(kāi)發(fā)通用應(yīng)用(放到Android Market或者其他App Market銷(xiāo)售)以及游戲開(kāi)發(fā)(放到Android Market或者其他App Market銷(xiāo)售)。第一類(lèi)開(kāi)發(fā)者一般身處規(guī)模較大的公司,這些公司主要為自有品牌或者其他品牌設(shè)計(jì)手機(jī)或者平板電腦的總體方案。除了根據(jù)需求對(duì)系統(tǒng)進(jìn)行定制外,更多的工作在于為這些系統(tǒng)編寫(xiě)定制的應(yīng)用。第二類(lèi)開(kāi)發(fā)者,一般處于創(chuàng)業(yè)型公司或者是獨(dú)立開(kāi)發(fā)者,他

21、們的盈利方式主要是2種:為國(guó)外公司進(jìn)行外包開(kāi)發(fā),或者通過(guò)Google的移動(dòng)廣告(AdMob)通過(guò)廣告點(diǎn)擊分成。而理論上的通過(guò)付費(fèi)下載的形式來(lái)盈利的,現(xiàn)在國(guó)內(nèi)鮮見(jiàn)成功者。第三類(lèi)開(kāi)發(fā)者,目前和第二類(lèi)開(kāi)發(fā)者類(lèi)似。</p><p>  北京時(shí)間4月15日晚間消息,移動(dòng)應(yīng)用分析公司App Annie今日發(fā)布報(bào)告稱(chēng),今年第一季度,谷歌Google Play應(yīng)用商店在下載量方面依舊主導(dǎo)全球市場(chǎng)。報(bào)告稱(chēng),第一季度Google P

22、lay全球應(yīng)用下載量較App Store高出45%,這主要得益于新興市場(chǎng)的推動(dòng),如俄羅斯、巴西、墨西哥和土耳其,其發(fā)展速度令無(wú)數(shù)人驚嘆,而Android產(chǎn)品占中國(guó)整體智能手機(jī)銷(xiāo)量的更是令其他系統(tǒng)無(wú)法企及,這些數(shù)字意味著龐大的市場(chǎng),自然能讓?xiě)?yīng)用開(kāi)發(fā)商欲罷不能,但Android碎片化的多版本問(wèn)題正愈演愈烈。兩相比較間,不少開(kāi)發(fā)商陷入了兩難的境地。在Android開(kāi)發(fā)者官方網(wǎng)站上,不少開(kāi)發(fā)者亦吐露出“抓狂”的情緒。</p>&l

23、t;p>  由于本質(zhì)為開(kāi)源,Android系統(tǒng)發(fā)展至今,幾乎完全脫離了谷歌的控制,其花費(fèi)巨大開(kāi)發(fā)的新版本系統(tǒng)往往在手機(jī)廠商需要為新品添加噱頭的時(shí)候才會(huì)用上。</p><p><b>  研究?jī)?nèi)容與目標(biāo)</b></p><p>  根據(jù)如今安卓設(shè)備的普及,以及現(xiàn)如今人們?cè)桨l(fā)的重視身體的健康,開(kāi)始在閑暇的時(shí)間開(kāi)展一些體育活動(dòng),一些與健康相關(guān)的安卓應(yīng)用被人們需要,也更

24、顯現(xiàn)出它們的實(shí)用性。而我開(kāi)發(fā)的則是一款基于安卓的跑步軟件。它可以實(shí)現(xiàn)利用GPS以及百度地圖API實(shí)現(xiàn)記錄用戶跑步路徑以及跑步距離的功能。</p><p><b>  理論技術(shù)基礎(chǔ)</b></p><p><b>  理論基礎(chǔ)</b></p><p><b>  系統(tǒng)內(nèi)核</b></p>

25、<p>  Android 是運(yùn)行于Linux kernel之上,但并不是GNU/Linux。因?yàn)樵谝话鉍NU/Linux 里支持的功能,Android 大都沒(méi)有支持,包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以Bionic 取代Glibc、以Skia 取代Cairo、再以opencore取代FFmpeg等等。Android 為了達(dá)到商業(yè)應(yīng)用,必須移除被GNU

26、 GPL授權(quán)證所約束的部份,例如Android將驅(qū)動(dòng)程序移到 Userspace,使得Linux driver 與 Linux kernel徹底分開(kāi)。Bionic/Libc/Kernel/ 并非標(biāo)準(zhǔn)的Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所產(chǎn)生的,這樣做是為了保留常數(shù)、數(shù)據(jù)結(jié)構(gòu)與宏。</p><p>  And

27、roid 的 Linux kernel控制包括安全(Security),存儲(chǔ)器管理(Memory Management),程序管理(Process Management),網(wǎng)絡(luò)堆棧(Network Stack),驅(qū)動(dòng)程序模型(Driver Model)等。下載Android源碼之前,先要安裝其構(gòu)建工具 Repo來(lái)初始化源碼。Repo 是 Android 用來(lái)輔助Git工作的一個(gè)工具。</p><p><b&

28、gt;  后綴簡(jiǎn)介</b></p><p>  APK是安卓應(yīng)用的后綴,是AndroidPackage的縮寫(xiě),即Android安裝包(apk)。APK是類(lèi)似Symbian Sis或Sisx的文件格式。通過(guò)將APK文件直接傳到Android模擬器或Android手機(jī)中執(zhí)行即可安裝。apk文件和sis一樣,把a(bǔ)ndroid sdk編譯的工程打包成一個(gè)安裝程序文件,格式為apk。 APK文件其實(shí)是zip格式

29、,但后綴名被修改為apk,通過(guò)UnZip解壓后,可以看到Dex文件,Dex是Dalvik VM executes的全稱(chēng),即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。</p><p><b>  APK文件結(jié)構(gòu)</b></p><p>  一個(gè)APK文件結(jié)構(gòu)為:</p><p>  1. META-I

30、NF\ (注:Jar文件中常可以看到);</p><p>  2. res\ (注:存放資源文件的目錄) ;</p><p>  3. AndroidManifest.xml (注:程序全局配置文件) ;</p><p>  4. classes.dex (注:Dalvik字節(jié)碼);</p><p>  5. resources.arsc (

31、注:編譯后的二進(jìn)制資源文件)。</p><p>  總結(jié)下我們發(fā)現(xiàn)Android在運(yùn)行一個(gè)程序時(shí)首先需要UnZip,然后類(lèi)似Symbian那樣直接執(zhí)行安裝,和Windows Mobile中的PE文件有區(qū)別,這樣做對(duì)于程序的保密性和可靠性不是很高,通過(guò)dexdump命令可以反編譯,但這樣做符合發(fā)展規(guī)律,微軟的 Windows Gadgets或者說(shuō)WPF也采用了這種構(gòu)架方式。</p><p>

32、  在Android平臺(tái)中dalvik vm的執(zhí)行文件被打包為apk格式,最終運(yùn)行時(shí)加載器會(huì)解壓然后獲取編譯后androidmanifest.xml文件中的permission分支相關(guān)的安全訪問(wèn),但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下會(huì)發(fā)現(xiàn)執(zhí)行是不受限制的。</p><p>  最終我們平時(shí)安裝的文件可能不是這個(gè)文件夾,而在android rom中系統(tǒng)的apk文件默認(rèn)會(huì)放入這

33、個(gè)文件夾,它們擁有著root權(quán)限。</p><p><b>  硬件抽像層</b></p><p>  Android 的HAL(硬件抽像層)是能以封閉源碼形式提供硬件驅(qū)動(dòng)模塊。HAL 的目的是為了把 Android framework 與 Linux kernel 隔開(kāi),讓 Android 不至過(guò)度依賴 Linux kernel,以達(dá)成 Kernel indepen

34、dent 的概念,也讓 Android framework 的開(kāi)發(fā)能在不考量驅(qū)動(dòng)程序?qū)崿F(xiàn)的前提下進(jìn)行發(fā)展。</p><p>  HAL stub 是一種代理人(Proxy)的概念,Stub 是以 *.so 檔的形式存在。Stub 向 HAL“提供”操作函數(shù)(Operations),并由 Android runtime 向 HAL 取得 Stub 的Operations,再 Callback 這些操作函數(shù)。HAL

35、里包含了許多的 Stub(代理人)。Runtime 只要說(shuō)明“類(lèi)型”,即 Module ID,就可以取得操作函數(shù)。</p><p><b>  中介軟件</b></p><p>  操作系統(tǒng)與應(yīng)用程序的溝通橋梁,應(yīng)用分為兩層:函數(shù)層(Library)和虛擬機(jī)(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同時(shí)包

36、含了Webkit,所謂的Webkit 就是Apple Safari 瀏覽器背后的引擎。Surface flinger 是就2D或3D的內(nèi)容顯示到屏幕上。Android使用工具鏈(Toolchain)為Google自制的Bionic Libc。</p><p>  Android采用OpenCORE作為基礎(chǔ)多媒體框架。Open CORE可分7大塊:PVPlayer、PVAuthor、Codec、PacketVide

37、o Multimedia Framework(PVMF)、Operating System Compatibility Library(OSCL)、Common、OpenMAX。</p><p>  Android 使用skia 為核心圖形引擎,搭配OpenGL/ES。skia與Linux Cairo功能相當(dāng),但相較于Linux Cairo, skia 功能還只是雛形的。2005年Skia公司被Google收購(gòu),

38、2007年初,Skia GL源碼被公開(kāi),Skia 也是Google Chrome 的圖形引擎。</p><p>  Android的多媒體數(shù)據(jù)庫(kù)采用SQLite數(shù)據(jù)庫(kù)系統(tǒng)。數(shù)據(jù)庫(kù)又分為共用數(shù)據(jù)庫(kù)及私用數(shù)據(jù)庫(kù)。用戶可通過(guò)ContentResolver類(lèi)(Column)取得共用數(shù)據(jù)庫(kù)。</p><p>  Android的中間層多以Java 實(shí)現(xiàn),并且采用特殊的Dalvik 虛擬機(jī)(Dalvi

39、k Virtual Machine)。Dalvik虛擬機(jī)是一種“暫存器型態(tài)”(Register Based)的Java虛擬機(jī),變量皆存放于暫存器中,虛擬機(jī)的指令相對(duì)減少。</p><p>  Dalvik虛擬機(jī)可以有多個(gè)實(shí)例(Instance), 每個(gè)Android應(yīng)用程序都用一個(gè)自屬的Dalvik虛擬機(jī)來(lái)運(yùn)行,讓系統(tǒng)在運(yùn)行程序時(shí)可達(dá)到優(yōu)化。Dalvik 虛擬機(jī)并非運(yùn)行Java字節(jié)碼(Bytecode),而是運(yùn)行

40、一種稱(chēng)為.dex格式的文件。</p><p><b>  安全權(quán)限機(jī)制</b></p><p>  Android本身是一個(gè)權(quán)限分立的操作系統(tǒng)。在這類(lèi)操作系統(tǒng)中,每個(gè)應(yīng)用都以唯一的一個(gè)系統(tǒng)識(shí)別身份運(yùn)行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨(dú)立的識(shí)別方式。Linux就是這樣將應(yīng)用與應(yīng)用,應(yīng)用與系統(tǒng)隔離開(kāi)。</p><p> 

41、 系統(tǒng)更多的安全功能通過(guò)權(quán)限機(jī)制提供。權(quán)限可以限制某個(gè)特定進(jìn)程的特定操作,也可以限制每個(gè)URI權(quán)限對(duì)特定數(shù)據(jù)段的訪問(wèn)。</p><p>  Android安全架構(gòu)的核心設(shè)計(jì)思想是,在默認(rèn)設(shè)置下,所有應(yīng)用都沒(méi)有權(quán)限對(duì)其他應(yīng)用、系統(tǒng)或用戶進(jìn)行較大影響的操作。這其中包括讀寫(xiě)用戶隱私數(shù)據(jù)(聯(lián)系人或電子郵件),讀寫(xiě)其他應(yīng)用文件,訪問(wèn)網(wǎng)絡(luò)或阻止設(shè)備待機(jī)等。</p><p>  安裝應(yīng)用時(shí),在檢查程序簽

42、名提及的權(quán)限,且經(jīng)過(guò)用戶確認(rèn)后,軟件包安裝器會(huì)給予應(yīng)用權(quán)限。從用戶角度看,一款A(yù)ndroid應(yīng)用通常會(huì)要求如下的權(quán)限:</p><p>  撥打電話、發(fā)送短信或彩信、修改/刪除SD卡上的內(nèi)容、讀取聯(lián)系人的信息、讀取日程信的息,寫(xiě)入日程數(shù)據(jù)、讀取電話狀態(tài)或識(shí)別碼、精確的(基于GPS)地理位置、模糊的(基于網(wǎng)絡(luò)獲?。┑乩砦恢谩?chuàng)建藍(lán)牙連接、對(duì)互聯(lián)網(wǎng)的完全訪問(wèn)、查看網(wǎng)絡(luò)狀態(tài),查看WiFi狀態(tài)、避免手機(jī)待機(jī)、修改系統(tǒng)全局

43、設(shè)置、讀取同步設(shè)定、開(kāi)機(jī)自啟動(dòng)、重啟其他應(yīng)用、終止運(yùn)行中的應(yīng)用、設(shè)定偏好應(yīng)用、震動(dòng)控制、拍攝圖片等。</p><p>  一款應(yīng)用應(yīng)該根據(jù)自身提供的功能,要求合理的權(quán)限。用戶也可以分析一款應(yīng)用所需權(quán)限,從而簡(jiǎn)單判定這款應(yīng)用是否安全。如一款應(yīng)用是不帶廣告的單機(jī)版,也沒(méi)有任何附加的內(nèi)容需要下載,那么它要求訪問(wèn)網(wǎng)絡(luò)的權(quán)限就比較可疑。</p><p><b>  百度地圖定位</b

44、></p><p>  百度地圖Android定位SDK是利用設(shè)備當(dāng)前的GPS信息(GPS定位),基站信息(基站定位)和Wi-Fi信息(Wi-Fi定位)完成定位的。開(kāi)發(fā)者在應(yīng)用中成功集成百度定位SDK以后,既可以方便的通過(guò)定位SDK的接口向百度定位服務(wù)請(qǐng)求位置信息。</p><p>  定位SDK會(huì)根據(jù)設(shè)備當(dāng)前的實(shí)際情況(如是否開(kāi)啟GPS,是否連接網(wǎng)絡(luò),是否掃描到Wi-Fi信息等)生

45、成定位依據(jù),并根據(jù)開(kāi)發(fā)者設(shè)置的實(shí)際定位策略(包括三種:高精度模式,低功耗模式,僅用設(shè)備模式)進(jìn)行定位。</p><p><b>  技術(shù)基礎(chǔ)</b></p><p>  本次開(kāi)發(fā)主要用到Android SDK以及百度地圖的API,開(kāi)發(fā)工具采用Eclipse導(dǎo)入Android開(kāi)發(fā)包、百度地圖API以及百度定位技術(shù)的API,如圖2.2</p><p&g

46、t;  而在安卓應(yīng)用的開(kāi)發(fā)過(guò)程中,需要使用的安卓模擬器,而本次開(kāi)發(fā)前期所使用到的則是Android自帶模擬器。自帶的模擬器主要用于檢查控件的功能以及設(shè)計(jì)是否完善。由于本次開(kāi)發(fā)需要用到GPS以及移動(dòng)網(wǎng)絡(luò)的支持,開(kāi)發(fā)中主要功能的測(cè)試依賴于移動(dòng)安卓設(shè)備。選用的設(shè)備為三星i9500,即三星Galaxy S4。三星Samsung Galaxy S 系列新一代的旗艦Galaxy S 4 它采用了像素密度為 441 ppi (480dpi)的 5 吋

47、 1080p(1,920 x 1,080) Super AMOLED HD 屏幕和 2GB RAM,處理器根據(jù)地區(qū)不同分為兩種版本,國(guó)際版為雙四核 1.6GHz+ 1.2GHz的 Exynos 處理器,定制版本是四核 1.9GHz 的高通驍龍600處理器或驍龍800處理器,配備有1280萬(wàn)后置攝像頭和210萬(wàn)像素的前置攝像頭,支持藍(lán)牙4.0技術(shù)和NFC近場(chǎng)通訊等功能。上市時(shí)預(yù)載的系統(tǒng)是 Android4.2.2。使用的設(shè)備定位以及對(duì)軟件

48、支持方面能夠非常出色的滿足開(kāi)發(fā)要求,測(cè)試是開(kāi)發(fā)中不可忽視的重要環(huán)節(jié)。</p><p><b>  系統(tǒng)分析與設(shè)計(jì)</b></p><p><b>  需求分析</b></p><p><b>  編寫(xiě)目的</b></p><p>  現(xiàn)在的人們?cè)絹?lái)越重視健康,因此出現(xiàn)了許多跑步

49、愛(ài)好者。而他們需要一些工具來(lái)記錄自己跑過(guò)的路徑和跑步的距離,以此來(lái)判斷自己的運(yùn)動(dòng)程度是否達(dá)到自己滿意的程度。而現(xiàn)在多數(shù)人都擁有Android設(shè)備,并且考慮到Android的開(kāi)源性,Android的開(kāi)發(fā)相對(duì)比較實(shí)際。所以本次要開(kāi)發(fā)一個(gè)基于Android系統(tǒng)的跑步軟件。</p><p><b>  術(shù)語(yǔ)定義 </b></p><p>  Activity: Ac

50、tivity是Android組件中最基本也是最為常見(jiàn)用的四大組件(Activity,Service服務(wù),Content Provider內(nèi)容提供者,BroadcastReceiver廣播接收器)之一。Activity是一個(gè)應(yīng)用程序組件,提供一個(gè)屏幕,用戶可以用來(lái)交互為了完成某項(xiàng)任務(wù)。Activity中所有操作都與用戶密切相關(guān),是一個(gè)負(fù)責(zé)與用戶交互的組件,可以通過(guò)setContentView(View)來(lái)顯示指定控件。在一個(gè)androi

51、d應(yīng)用中,一個(gè)Activity通常就是一個(gè)單獨(dú)的屏幕,它上面可以顯示一些控件也可以監(jiān)聽(tīng)并處理用戶的事件做出響應(yīng)。Activity之間通過(guò)Intent進(jìn)行通信。</p><p>  Intent:Intent(意圖)主要是解決Android應(yīng)用的各項(xiàng)組件之間的通訊。Intent負(fù)責(zé)對(duì)應(yīng)用中一次操作的動(dòng)作、動(dòng)作涉及數(shù)據(jù)、附加數(shù)據(jù)進(jìn)行描述,Android則根據(jù)此Intent的描述,負(fù)責(zé)找到對(duì)應(yīng)的組件,將 Intent傳

52、遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個(gè)媒體中介的作用,專(zhuān)門(mén)提供組件互相調(diào)用的相關(guān)信息,實(shí)現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。</p><p>  百度定位SDK: 百度地圖Android定位SDK是為Android移動(dòng)端應(yīng)用提供的一套簡(jiǎn)單易用的LBS定位服務(wù)接口,專(zhuān)注于為廣大開(kāi)發(fā)者提供最好的綜合定位服務(wù),通過(guò)使用百度定位SDK,開(kāi)發(fā)者可以輕松為應(yīng)用程序?qū)崿F(xiàn)智能、精準(zhǔn)、高效的定位功能。<

53、/p><p>  百度地圖SDK:百度地圖 Android SDK是一套基于Android 2.1及以上版本設(shè)備的應(yīng)用程序接口。您可以使用該套 SDK開(kāi)發(fā)適用于Android系統(tǒng)移動(dòng)設(shè)備的地圖應(yīng)用,通過(guò)調(diào)用地圖SDK接口,您可以輕松訪問(wèn)百度地圖服務(wù)和數(shù)據(jù),構(gòu)建功能豐富、交互性強(qiáng)的地圖類(lèi)應(yīng)用程序。</p><p>  API:API(Application Programming Interfa

54、ce,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開(kāi)發(fā)人員基于某軟件或硬件的以訪問(wèn)一組例程的能力,而又無(wú)需訪問(wèn)源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。</p><p><b>  總體設(shè)計(jì)</b></p><p><b>  系統(tǒng)功能</b></p><p>  針對(duì)本系統(tǒng)的設(shè)計(jì),主要實(shí)現(xiàn)兩個(gè)功能:</p&g

55、t;<p>  用戶在使用時(shí),可以通過(guò)地圖隨時(shí)查看跑步的路徑</p><p>  用戶在使用時(shí),可以隨時(shí)查看自己已經(jīng)跑過(guò)的距離</p><p>  通過(guò)這兩個(gè)功能可以讓用戶做到對(duì)自己的運(yùn)動(dòng)狀況有所掌控,對(duì)自己的運(yùn)動(dòng)情況心中有數(shù)。</p><p><b>  軟件結(jié)構(gòu)</b></p><p>  本系統(tǒng)共有一

56、個(gè)Activity,在這個(gè)Activity中要實(shí)現(xiàn)查看地圖,查看跑步距離。則要分出地圖定位模塊,距離計(jì)算以及路程記錄模塊。</p><p><b>  程序流程圖</b></p><p>  當(dāng)用戶進(jìn)入到界面后,選擇開(kāi)始按鈕,則開(kāi)始計(jì)時(shí)并且記錄跑步的數(shù)據(jù),在界面上輸出用戶跑步的距離;這時(shí)候用戶可以選擇查看地圖或者暫停;當(dāng)查看地圖用戶選擇查看地圖后,可以看到自己跑步的路

57、線,可以對(duì)地圖進(jìn)行縮放;然后用戶可以關(guān)閉地圖,回到主界面,使地圖在后臺(tái)運(yùn)行;最后用戶可以選擇關(guān)閉應(yīng)用程序。</p><p><b>  詳細(xì)設(shè)計(jì)</b></p><p><b>  總體界面設(shè)計(jì)</b></p><p><b>  主界面</b></p><p><b&g

58、t;  開(kāi)始跑步界面</b></p><p><b>  地圖界面</b></p><p><b>  模塊功能設(shè)計(jì)</b></p><p>  系統(tǒng)分為兩個(gè)模塊:定位模塊與繪制地圖模塊</p><p>  雖然分為兩個(gè)模塊,但是兩個(gè)模塊之間并不是完全沒(méi)有關(guān)聯(lián),因?yàn)樵诙ㄎ坏耐瑫r(shí)要繪制用戶

59、經(jīng)過(guò)的線路。而且記錄用戶跑步的距離并不能只記錄用戶的起點(diǎn)和終點(diǎn),因?yàn)榘俣鹊貓D計(jì)算的是兩點(diǎn)之間的直線距離,只是依據(jù)起點(diǎn)和終點(diǎn)來(lái)計(jì)算將會(huì)造成計(jì)算出的距離與用戶實(shí)際跑步的距離不相符合的情況。而這里用到了數(shù)學(xué)中“微量元素”的思想。記錄用戶短時(shí)間內(nèi)的起點(diǎn)與終點(diǎn)之間的距離,然后將這些短時(shí)間運(yùn)動(dòng)的距離相加最終可近似的得到用戶跑步的最終距離。這樣的方式所得到的距離誤差小到可以忽略不計(jì),而且繪制出來(lái)的跑步路徑也最接近用戶真實(shí)的跑步路線。</p>

60、;<p><b>  定位模塊</b></p><p>  這個(gè)模塊中需要初始化地圖信息以及定位信息,設(shè)置定位相關(guān)的參數(shù),并且在用戶開(kāi)始跑步后立即啟動(dòng)定位功能。而這個(gè)定位相應(yīng)的用到了百度定位SDK以及百度地圖SDK。通過(guò)調(diào)用百度地圖的接口,可以實(shí)時(shí)獲得用戶當(dāng)前的位置,即用戶當(dāng)前位置的經(jīng)度緯度坐標(biāo)。</p><p>  在這個(gè)模塊中,將地圖以及定位信息初始

61、化,同時(shí)設(shè)置按鈕的監(jiān)聽(tīng),一旦用戶開(kāi)始跑步,立即開(kāi)啟定位功能,在后臺(tái)每隔很短的一段時(shí)間獲取用戶的經(jīng)度緯度坐標(biāo)。</p><p><b>  繪制地圖模塊</b></p><p>  這個(gè)模塊中要繪制用戶跑步的路徑,將其在百度地圖上標(biāo)記出來(lái),并且同時(shí)統(tǒng)計(jì)用戶跑步的距離。計(jì)算距離的方式上文中已經(jīng)說(shuō)明,在此不再贅述。</p><p>  這并不是一個(gè)獨(dú)

62、立的模塊,這個(gè)模塊需要在上一個(gè)模塊的基礎(chǔ)上來(lái)操作。而繪制的路線相當(dāng)于在百度地圖上新增加的圖層上進(jìn)行繪制。但是在用戶看來(lái)只是一個(gè)圖層。而繪制路線的方式也是用折線來(lái)近似表示曲線,在視覺(jué)上看來(lái)并沒(méi)有偏差。而繪制路線以及計(jì)算距離需要用到百度地圖API,對(duì)百度地圖提供的接口加以更改就可以達(dá)到本次開(kāi)發(fā)的目的。</p><p><b>  系統(tǒng)實(shí)現(xiàn)</b></p><p><

63、b>  主要界面</b></p><p>  界面大約有三個(gè)主要的界面,分別為主界面,跑步開(kāi)始界面以及查看地圖界面。</p><p><b>  主界面</b></p><p>  當(dāng)用戶打開(kāi)應(yīng)用便進(jìn)入主界面,在這里用戶可以開(kāi)始跑步,也可以退出應(yīng)用。</p><p><b>  開(kāi)始跑步界面&

64、lt;/b></p><p>  跑步開(kāi)始便顯示用戶跑步的距離,時(shí)間等信息,詳細(xì)解說(shuō)如下圖:</p><p><b>  查看地圖</b></p><p>  查看地圖界面,在這里用戶可以方便的查看到自己跑步所經(jīng)過(guò)的路徑,詳細(xì)解說(shuō)見(jiàn)下圖:</p><p><b>  代碼結(jié)構(gòu)</b></

65、p><p>  本次開(kāi)發(fā)有一個(gè)Activity,除此之外還有一個(gè)用來(lái)繪制路線圖的類(lèi),具體如下:</p><p>  MapActivity類(lèi):繼承android.app.Activity,本Activity中需要初始化地圖還有定位信息,并且為地圖設(shè)置監(jiān)聽(tīng)函數(shù),每隔一秒鐘更新一次用戶的位置信息,并且更新用戶路線還有用戶跑步距離等信息。具體介紹如下:</p><p><

66、;b>  包含兩個(gè)內(nèi)部類(lèi):</b></p><p>  locationOverlay類(lèi):繼承com.baidu.mapapi.map.MyLocationOverlay,這個(gè)類(lèi)是用來(lái)給地圖添加泡泡圖層,即用戶觸摸地圖上當(dāng)前位置點(diǎn)時(shí)會(huì)彈出一個(gè)圖層,告知用戶這個(gè)點(diǎn)為現(xiàn)在所處的位置。</p><p>  MyLocationListenner類(lèi):實(shí)現(xiàn)com.baidu.loc

67、ation.BDLocationListener接口,BDLocationListener接口有2個(gè)方法需要實(shí)現(xiàn):</p><p>  onReceiveLocation方法:接收異步返回的定位結(jié)果,參數(shù)是BDLocation類(lèi)型參數(shù)。 </p><p><b>  主要代碼:</b></p><p>  //判斷是否是第一次定位,第一次則給前

68、一次定位坐標(biāo)(preLocData)賦初始值,如果不是第一次定位則將上一次定位得到的數(shù)據(jù)賦值給preLocData用來(lái)記錄前一次的位置</p><p>  if(isFirstLoc == true){</p><p>  preLocData.latitude = location.getLatitude() ;</p><p>  preLocData.long

69、itude = location.getLongitude() ;</p><p><b>  }else{</b></p><p>  preLocData.latitude = locData.latitude ;</p><p>  preLocData.longitude = locData.longitude ;}</p>

70、<p>  //獲取當(dāng)前位置信息</p><p>  locData.latitude = location.getLatitude();</p><p>  locData.longitude = location.getLongitude();</p><p>  //調(diào)用繪制路線函數(shù),在地圖上繪制路線圖</p><p> 

71、 DrawGraphic();</p><p>  onReceivePoi方法:接收異步返回的POI查詢結(jié)果,參數(shù)是BDLocation類(lèi)型參數(shù)。</p><p><b>  主要函數(shù):</b></p><p>  onCreate方法:OnCreate()不產(chǎn)生窗口,只是在窗口顯示前設(shè)置窗口的屬性如風(fēng)格、位置等,Create()負(fù)責(zé)注冊(cè)并產(chǎn)

72、生窗口,是整個(gè)Activity的入口。在這里我們初始化了地圖以及定位信息的參數(shù)。</p><p><b>  主要代碼:</b></p><p>  super.onCreate(savedInstanceState);//調(diào)用父類(lèi)onCreate函數(shù)</p><p>  //初始化地圖管理類(lèi)對(duì)象,獲取當(dāng)前的Application,初始化地圖&

73、lt;/p><p>  mBMapMan=new BMapManager(getApplication());</p><p>  mBMapMan.init(null);</p><p>  setContentView(R.layout.activity_map);//設(shè)置Activity的布局文件</p><p>  //將這個(gè)activi

74、ty添加到activity管理列表</p><p>  ManageActivity.getInstance().add("MapActivity", this);</p><p><b>  //初始化控件</b></p><p>  ch = (Chronometer) findViewById(R.id.map_chr

75、onometer1) ;//計(jì)時(shí)器</p><p>  start = (Button) findViewById(R.id.map_start) ;//開(kāi)始按鈕</p><p>  stop = (Button) findViewById(R.id.map_stop) ; //暫停按鈕</p><p>  showMap = (Button) findViewBy

76、Id(R.id.map_show) ;//查看地圖按鈕</p><p>  closeMap = (Button) findViewById(R.id.map_closemap) ;//關(guān)閉地圖按鈕</p><p>  ed = (EditText) findViewById(R.id.map_showdistance) ;//顯示距離文本</p><p>  di

77、stance = 0 ;//初始化距離參數(shù)</p><p>  this.firstTime = true ;//初始化標(biāo)記是否是第一次定位</p><p>  //設(shè)置按鈕Button的可見(jiàn)度</p><p>  stop.setVisibility(View.GONE);</p><p>  closeMap.setVisibility(

78、View.GONE);</p><p>  showMap.setVisibility(View.GONE);</p><p><b>  //地圖對(duì)象賦值</b></p><p>  mMapView=(MapView)findViewById(R.id.bmapView);</p><p>  mMapControl

79、ler = mMapView.getController();</p><p>  mMapView.getController().setZoom(14);</p><p>  mMapView.getController().enableClick(true);</p><p>  mMapView.setBuiltInZoomControls(true);&l

80、t;/p><p>  //設(shè)置啟用內(nèi)置的縮放控件 </p><p>  MapController mMapController=mMapView.getController(); </p><p>  onClick方法:這個(gè)是控件的觸摸事件函數(shù),當(dāng)觸摸控件時(shí)便執(zhí)行這個(gè)函數(shù)。這個(gè)函數(shù)的主題其實(shí)是switch結(jié)構(gòu),用來(lái)判斷控件是否被觸摸,相應(yīng)的執(zhí)行操作。</p

81、><p><b>  主要代碼:</b></p><p>  boolean isStart = true ;</p><p>  switch(v.getId()){</p><p>  case R.id.map_show :{</p><p>  mMapView.setVisibility(V

82、iew.VISIBLE) ;</p><p>  start.setVisibility(View.GONE);</p><p>  stop.setVisibility(View.GONE);</p><p>  ch.setVisibility(View.GONE);</p><p>  showMap.setVisibility(Vie

83、w.GONE);</p><p>  ed.setVisibility(View.GONE);</p><p>  closeMap.setVisibility(View.VISIBLE);</p><p><b>  break;</b></p><p><b>  }</b></p>

84、<p>  case R.id.map_start :{</p><p>  if(isStart){</p><p><b>  //定位初始化</b></p><p>  mLocClient = new LocationClient( this );</p><p>  locData = new L

85、ocationData();</p><p>  preLocData = new LocationData() ;</p><p>  mLocClient.registerLocationListener( myListener );</p><p>  LocationClientOption option = new LocationClientOption

86、();</p><p>  option.setOpenGps(true);//打開(kāi)gps</p><p>  option.setCoorType("bd09ll"); //設(shè)置坐標(biāo)類(lèi)型</p><p>  option.setScanSpan(1000);//設(shè)置定位時(shí)間間隔</p><p>  mLoc

87、Client.setLocOption(option);</p><p>  mLocClient.start();</p><p>  //創(chuàng)建 彈出泡泡圖層</p><p>  createPaopao();</p><p><b>  //定位圖層初始化</b></p><p>  myLo

88、cationOverlay = new locationOverlay(mMapView);</p><p><b>  //設(shè)置定位數(shù)據(jù)</b></p><p>  myLocationOverlay.setData(locData);</p><p><b>  //添加定位圖層</b></p><

89、p>  mMapView.getOverlays().add(myLocationOverlay);</p><p>  myLocationOverlay.enableCompass();</p><p>  //修改定位數(shù)據(jù)后刷新圖層生效</p><p>  mMapView.refresh();</p><p><b>

90、  }</b></p><p><b>  //開(kāi)始計(jì)時(shí)</b></p><p>  if(this.firstTime){</p><p>  ch.setBase(SystemClock.elapsedRealtime());</p><p>  this.firstTime = false ;</

91、p><p>  showMap.setVisibility(View.VISIBLE);</p><p><b>  }</b></p><p><b>  else{</b></p><p>  //調(diào)整計(jì)時(shí)器暫停后的值</p><p>  long temp = (long)

92、 (Double.parseDouble(ch.getText().toString().split(":")[1]) * 1000); </p><p>  ch.setBase(SystemClock.elapsedRealtime() - temp);</p><p><b>  }</b></p><p>  ch

93、.start();//計(jì)時(shí)器開(kāi)始</p><p>  start.setVisibility(View.GONE);</p><p>  stop.setVisibility(View.VISIBLE);</p><p>  isStart = false ;</p><p><b>  break;</b></p

94、><p><b>  }</b></p><p>  case R.id.map_stop :{</p><p><b>  //暫停計(jì)時(shí)</b></p><p>  ch.stop();</p><p>  long temp = (long) (Double.parseDou

95、ble(ch.getText().toString().split(":")[1]) * 1000); </p><p>  ch.setBase(SystemClock.elapsedRealtime() - temp);</p><p>  stop.setVisibility(View.GONE);</p><p>  start.setV

96、isibility(View.VISIBLE);</p><p>  mLocClient.stop() ;//暫停定位</p><p>  isStart = true ;</p><p><b>  break;</b></p><p><b>  }</b></p><p&

97、gt;  case R.id.map_closemap:{</p><p>  mMapView.setVisibility(View.INVISIBLE);</p><p>  closeMap.setVisibility(View.INVISIBLE);</p><p>  showMap.setVisibility(View.VISIBLE);</p&g

98、t;<p>  ch.setVisibility(View.VISIBLE);</p><p>  ed.setVisibility(View.VISIBLE);</p><p>  if(!isStart){</p><p>  start.setVisibility(View.VISIBLE);</p><p><b&

99、gt;  }else{</b></p><p>  stop.setVisibility(View.VISIBLE);</p><p><b>  }</b></p><p><b>  }</b></p><p>  onDestroy方法:activity被完全從系統(tǒng)內(nèi)存中移除時(shí)調(diào)用

100、,該方法被調(diào)用。</p><p>  onPause方法:activity被暫?;蚴栈豤pu和其他資源時(shí)調(diào)用,該方法用于保存活動(dòng)狀態(tài)的,也是保護(hù)現(xiàn)場(chǎng),壓棧。</p><p>  onResume方法:activity開(kāi)始與用戶交互時(shí)調(diào)用(無(wú)論是啟動(dòng)還是重新啟動(dòng)一個(gè)活動(dòng),該方法總是被調(diào)用的)。</p><p>  DrawGraphic方法:在這個(gè)函數(shù)中調(diào)用畫(huà)圖的類(lèi)對(duì)

101、象,并且在這里累加用戶的短時(shí)間移動(dòng)距離。</p><p><b>  主要代碼:</b></p><p>  this.dg = new DrawGraphics(this);//給字段DrawGraphics類(lèi)對(duì)象dg申請(qǐng)空間</p><p>  dg.addCustomElementsDemo();//調(diào)用DrawGraphic類(lèi)中的畫(huà)圖方

102、法</p><p>  this.distance += dg.getDistance();//更新距離(distance)</p><p>  MyLocationMapView類(lèi):繼承com.baidu.mapapi.map.MapView類(lèi),重寫(xiě)onTouchEvent實(shí)現(xiàn)泡泡處理操作。</p><p>  DrawGraphics類(lèi):在這個(gè)類(lèi)中對(duì)圖層進(jìn)行操作

103、,可以在圖層上繪制圖形,這里主要是繪制直線,同時(shí)也記錄直線兩端之間的距離,函數(shù)具體介紹如下:</p><p>  DrawGraphics方法:構(gòu)造方法,在這里初始化一些需要的參數(shù)。</p><p>  addCustomElementsDemo方法:在這里調(diào)用繪制圖形的方法,并且將地圖刷新。</p><p><b>  主要代碼:</b>&l

104、t;/p><p>  GraphicsOverlay graphicsOverlay = new GraphicsOverlay(mMapView);</p><p>  mMapView.getOverlays().add(graphicsOverlay);</p><p><b>  //添加折線</b></p><p>

105、;  graphicsOverlay.setData(drawLine());</p><p>  //執(zhí)行地圖刷新使生效</p><p>  mMapView.refresh();</p><p>  drawLine方法:確定兩個(gè)點(diǎn),在兩個(gè)點(diǎn)之間繪制直線。</p><p><b>  主要代碼:</b></p&

106、gt;<p>  //前一次的位置信息</p><p>  double mLat = preLoc.latitude;</p><p>  double mLon = preLoc.longitude;</p><p>  int lat = (int) (mLat*1E6);</p><p>  int lon = (int

107、) (mLon*1E6); </p><p>  GeoPoint pt1 = new GeoPoint(lat, lon);</p><p><b>  //當(dāng)前位置信息</b></p><p>  mLat = locData.latitude;</p><p>  mLon = locData.longitu

108、de;</p><p>  lat = (int) (mLat*1E6);</p><p>  lon = (int) (mLon*1E6);</p><p>  GeoPoint pt2 = new GeoPoint(lat, lon);</p><p><b>  //構(gòu)建線</b></p><p

109、>  Geometry lineGeometry = new Geometry();</p><p><b>  //設(shè)定折線點(diǎn)坐標(biāo)</b></p><p>  GeoPoint[] linePoints = new GeoPoint[2];</p><p>  linePoints[0] = pt1;</p><p&

110、gt;  linePoints[1] = pt2;</p><p>  lineGeometry.setPolyLine(linePoints);</p><p><b>  //設(shè)定樣式</b></p><p>  Symbol lineSymbol = new Symbol();</p><p>  Symbol.C

111、olor lineColor = lineSymbol.new Color();</p><p>  lineColor.red = 255;</p><p>  lineColor.green = 0;</p><p>  lineColor.blue = 0;</p><p>  lineColor.alpha = 255;</p&

112、gt;<p>  lineSymbol.setLineSymbol(lineColor, 10);</p><p>  //生成Graphic對(duì)象</p><p>  Graphic lineGraphic = new Graphic(lineGeometry, lineSymbol);</p><p>  countDistance(pt1,pt2)

113、;</p><p>  return lineGraphic;</p><p>  countDistance方法:計(jì)算兩個(gè)點(diǎn)之間的直線距離。</p><p><b>  主要代碼:</b></p><p>  public void countDistance(GeoPoint p1, GeoPoint p2){<

114、;/p><p><b>  //起點(diǎn)坐標(biāo)</b></p><p>  GeoPoint start = p1;</p><p><b>  //終點(diǎn)坐標(biāo)</b></p><p>  GeoPoint stop = p2;</p><p>  GeoPoint[] routeDa

115、ta = new GeoPoint[2];</p><p>  routeData[0] = p1 ;</p><p>  routeData[1] = p2 ;</p><p>  //用站點(diǎn)數(shù)據(jù)構(gòu)建一個(gè)MKRoute</p><p>  MKRoute route = new MKRoute();</p><p>

116、  route.customizeRoute(start, stop, routeData);</p><p>  distance = route.getDistance() ;</p><p><b>  }</b></p><p><b>  開(kāi)發(fā)過(guò)程遇到的問(wèn)題</b></p><p>  在

117、開(kāi)發(fā)過(guò)程中,因?yàn)槭褂昧税俣鹊貓D的接口,所以在使用時(shí)需要做一些開(kāi)發(fā)的準(zhǔn)備工作,百度地圖的使用需要去百度地圖的官方網(wǎng)站去申請(qǐng)一個(gè)唯一的密鑰才可以在開(kāi)發(fā)中合法使用百度地圖。(申請(qǐng)密鑰的方法見(jiàn)附錄)</p><p>  在開(kāi)發(fā)過(guò)程中由于存在兩種獲取SHA1值的方式,而本次開(kāi)發(fā)遇到兩種方法得到的SHA1值不一致的情況。導(dǎo)致按照正確步驟申請(qǐng)的密鑰也不能夠正常使用的情況,最終發(fā)現(xiàn)系統(tǒng)本身的密鑰庫(kù)與Eclipse自帶的密鑰庫(kù)并不

溫馨提示

  • 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ù)僅提供信息存儲(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)論