2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩34頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

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

3、gt;  二O一四 年 六 月 一 日</p><p><b>  目錄</b></p><p><b>  1 緒論1</b></p><p>  1.1 研究背景與意義1</p><p>  1.2 國內(nèi)外研究現(xiàn)狀1</p><p>  1.3 研究內(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. 后綴簡介2</p><p>  2.1.3. 硬件抽像層3</p><p>  2.1.4. 中介軟件4</p&

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

6、;p>  3.1.2. 術(shù)語定義 7</p><p>  3.2 總體設(shè)計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è)計9</p><p&

7、gt;  3.3.1. 總體界面設(shè)計9</p><p>  3.3.2. 模塊功能設(shè)計10</p><p><b>  4 系統(tǒng)實現(xiàn)11</b></p><p>  4.1 主要界面11</p><p>  4.2 代碼結(jié)構(gòu)13</p><p>  4.3 開發(fā)過程遇到的問題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)在幾乎每個人都有移動

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

10、細(xì)模塊實現(xiàn)上分別敘述了它的各種技術(shù)原理及實現(xiàn)方案,進(jìn)而簡單的闡明了Android開發(fā)以及百度地圖API使用的相關(guān)技術(shù)。然后以本系統(tǒng)為例從需求分析、應(yīng)用技術(shù)、設(shè)計架構(gòu)思想、數(shù)據(jù)庫設(shè)計、系統(tǒng)詳細(xì)模塊實現(xiàn)上分別敘述了它的各種技術(shù)原理及實現(xiàn)方案,進(jìn)而簡單的闡明了開發(fā)一個基于Android的健康類應(yīng)用開發(fā)的相關(guān)技術(shù)。</p><p>  關(guān)鍵字:Android開發(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收購,并從此踏上了飛速發(fā)展的道路。經(jīng)過這幾年的發(fā)展,它已經(jīng)發(fā)展成了一個平臺、一個生態(tài)體系。現(xiàn)在Android在移動領(lǐng)域

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

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

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

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

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

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

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

24、顯現(xiàn)出它們的實用性。而我開發(fā)的則是一款基于安卓的跑步軟件。它可以實現(xiàn)利用GPS以及百度地圖API實現(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 是運行于Linux kernel之上,但并不是GNU/Linux。因為在一般GNU/Linux 里支持的功能,Android 大都沒有支持,包括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ū)動程序移到 Userspace,使得Linux driver 與 Linux kernel徹底分開。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),存儲器管理(Memory Management),程序管理(Process Management),網(wǎng)絡(luò)堆棧(Network Stack),驅(qū)動程序模型(Driver Model)等。下載Android源碼之前,先要安裝其構(gòu)建工具 Repo來初始化源碼。Repo 是 Android 用來輔助Git工作的一個工具。</p><p><b&

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

29、,但后綴名被修改為apk,通過UnZip解壓后,可以看到Dex文件,Dex是Dalvik VM executes的全稱,即Android Dalvik執(zhí)行程序,并非Java ME的字節(jié)碼而是Dalvik字節(jié)碼。</p><p><b>  APK文件結(jié)構(gòu)</b></p><p>  一個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在運行一個程序時首先需要UnZip,然后類似Symbian那樣直接執(zhí)行安裝,和Windows Mobile中的PE文件有區(qū)別,這樣做對于程序的保密性和可靠性不是很高,通過dexdump命令可以反編譯,但這樣做符合發(fā)展規(guī)律,微軟的 Windows Gadgets或者說WPF也采用了這種構(gòu)架方式。</p><p>

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

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

34、dent 的概念,也讓 Android framework 的開發(fā)能在不考量驅(qū)動程序?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 只要說明“類型”,即 Module ID,就可以取得操作函數(shù)。</p><p><b>  中介軟件</b></p><p>  操作系統(tǒng)與應(yīng)用程序的溝通橋梁,應(yīng)用分為兩層:函數(shù)層(Library)和虛擬機(Virtual Machine)。 Bionic是 Android 改良libc的版本。Android 同時包

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收購,

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

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

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

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

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

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

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

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

46、t;  而在安卓應(yīng)用的開發(fā)過程中,需要使用的安卓模擬器,而本次開發(fā)前期所使用到的則是Android自帶模擬器。自帶的模擬器主要用于檢查控件的功能以及設(shè)計是否完善。由于本次開發(fā)需要用到GPS以及移動網(wǎng)絡(luò)的支持,開發(fā)中主要功能的測試依賴于移動安卓設(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ū)不同分為兩種版本,國際版為雙四核 1.6GHz+ 1.2GHz的 Exynos 處理器,定制版本是四核 1.9GHz 的高通驍龍600處理器或驍龍800處理器,配備有1280萬后置攝像頭和210萬像素的前置攝像頭,支持藍(lán)牙4.0技術(shù)和NFC近場通訊等功能。上市時預(yù)載的系統(tǒng)是 Android4.2.2。使用的設(shè)備定位以及對軟件

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

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

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

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

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

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

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

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

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

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

58、t;  開始跑步界面</b></p><p><b>  地圖界面</b></p><p><b>  模塊功能設(shè)計</b></p><p>  系統(tǒng)分為兩個模塊:定位模塊與繪制地圖模塊</p><p>  雖然分為兩個模塊,但是兩個模塊之間并不是完全沒有關(guān)聯(lián),因為在定位的同時要繪制用戶

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

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

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

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

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

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

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

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

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

68、一次定位坐標(biāo)(preLocData)賦初始值,如果不是第一次定位則將上一次定位得到的數(shù)據(jù)賦值給preLocData用來記錄前一次的位置</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類型參數(shù)。</p><p><b>  主要函數(shù):</b></p><p>  onCreate方法:OnCreate()不產(chǎn)生窗口,只是在窗口顯示前設(shè)置窗口的屬性如風(fēng)格、位置等,Create()負(fù)責(zé)注冊并產(chǎn)

72、生窗口,是整個Activity的入口。在這里我們初始化了地圖以及定位信息的參數(shù)。</p><p><b>  主要代碼:</b></p><p>  super.onCreate(savedInstanceState);//調(diào)用父類onCreate函數(shù)</p><p>  //初始化地圖管理類對象,獲取當(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>  //將這個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) ;//計時器</p><p>  start = (Button) findViewById(R.id.map_start) ;//開始按鈕</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的可見度</p><p>  stop.setVisibility(View.GONE);</p><p>  closeMap.setVisibility(

78、View.GONE);</p><p>  showMap.setVisibility(View.GONE);</p><p><b>  //地圖對象賦值</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方法:這個是控件的觸摸事件函數(shù),當(dāng)觸摸控件時便執(zhí)行這個函數(shù)。這個函數(shù)的主題其實是switch結(jié)構(gòu),用來判斷控件是否被觸摸,相應(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);//打開gps</p><p>  option.setCoorType("bd09ll"); //設(shè)置坐標(biāo)類型</p><p>  option.setScanSpan(1000);//設(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>  //開始計時</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)整計時器暫停后的值</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();//計時器開始</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>  //暫停計時</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)存中移除時調(diào)用

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

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

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

103、,可以在圖層上繪制圖形,這里主要是繪制直線,同時也記錄直線兩端之間的距離,函數(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方法:確定兩個點,在兩個點之間繪制直線。</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è)定折線點坐標(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對象</p><p>  Graphic lineGraphic = new Graphic(lineGeometry, lineSymbol);</p><p>  countDistance(pt1,pt2)

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

114、;/p><p><b>  //起點坐標(biāo)</b></p><p>  GeoPoint start = p1;</p><p><b>  //終點坐標(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>  //用站點數(shù)據(jù)構(gòu)建一個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>  開發(fā)過程遇到的問題</b></p><p>  在

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

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論