版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 河北農(nóng)業(yè)大學</b></p><p> 本科畢業(yè)論文(設計)</p><p> 題 目: Android跑步應用開發(fā) </p><p> 學 院: 信息科學與技術學院 </p><p> 專業(yè)班級: 計算機1001班 </p&g
2、t;<p> 學 號: 2010234040931 </p><p> 學生姓名: 袁偲琦 </p><p> 指導教師姓名: 王 超 </p><p> 指導教師職稱: 講 師 </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)容與目標
4、2</p><p> 2 理論技術基礎2</p><p> 2.1 理論基礎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. 安全權限機制4</p><p> 2.1.6. 百度地圖定位5</p><p> 2.2 技術基礎5</p><p> 3 系統(tǒng)分析與設計6</p><p> 3.1 需求分析6</p><p> 3.1.1. 編寫目的6</p><
6、;p> 3.1.2. 術語定義 7</p><p> 3.2 總體設計7</p><p> 3.2.1. 系統(tǒng)功能7</p><p> 3.2.2. 軟件結構8</p><p> 3.2.3. 程序流程圖8</p><p> 3.3 詳細設計9</p><p&
7、gt; 3.3.1. 總體界面設計9</p><p> 3.3.2. 模塊功能設計10</p><p><b> 4 系統(tǒng)實現(xiàn)11</b></p><p> 4.1 主要界面11</p><p> 4.2 代碼結構13</p><p> 4.3 開發(fā)過程遇到的問題20<
8、;/p><p><b> 5 總結21</b></p><p><b> 參考文獻22</b></p><p><b> 附錄24</b></p><p><b> 摘要</b></p><p> 現(xiàn)在幾乎每個人都有移動
9、設備,而隨著科技的進步,移動設備已經(jīng)不僅僅是通訊工具,也成為了人們手中的玩物,甚至成為一些其他的工具,而各種各樣的移動應用出現(xiàn)在市場上,人們對移動應用的需求也漸漸增大。隨著人們對健康生活方式的追求,他們對一些健康類應用的需求也越來越大。</p><p> 本論文從學習、研究和探討的角度,介紹了Android開發(fā)的現(xiàn)狀以及Android開發(fā)未來的發(fā)展趨勢,然后以本系統(tǒng)為例從需求分析、應用技術、設計架構思想、系統(tǒng)詳
10、細模塊實現(xiàn)上分別敘述了它的各種技術原理及實現(xiàn)方案,進而簡單的闡明了Android開發(fā)以及百度地圖API使用的相關技術。然后以本系統(tǒng)為例從需求分析、應用技術、設計架構思想、數(shù)據(jù)庫設計、系統(tǒng)詳細模塊實現(xiàn)上分別敘述了它的各種技術原理及實現(xiàn)方案,進而簡單的闡明了開發(fā)一個基于Android的健康類應用開發(fā)的相關技術。</p><p> 關鍵字: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)體系?,F(xiàn)在Android在移動領域
17、已經(jīng)得到了廣泛的應用。根據(jù)Google于2011年6月份公布的數(shù)字,每天激活的Android設備高達50萬臺,今天,施密特再次更新了這一數(shù)據(jù)——現(xiàn)在,每天被激活的Android設備數(shù)量達到了150萬份。谷歌安卓系統(tǒng)負責人桑德爾·湃柴(Sundar Pichai)2013年09月宣布,采用安卓移動操作系統(tǒng)設備的激活量已經(jīng)超過10億臺。在全球銷售的智能手機中,有四分之三采用安卓操作系統(tǒng),并且有越來越多的平板電腦采用這個操作系統(tǒng)。
18、</p><p> 相比于Symbian的日落西山,以及蘋果的封閉、Windows Phone的前途未卜,Android無疑代表了當前行業(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)更加整合了自家服務,力求防止安卓系統(tǒng)繼續(xù)碎片化、分散化。目前市場上占主流的并不是4.4版本,當然,相信隨著時間的推移,4.4及后續(xù)版本會得到越來越多的設備的支持。</p><p><b> 國內(nèi)外研究現(xiàn)狀</b></p><p> 目前國內(nèi)的Android開發(fā)
20、還是主要以應用開發(fā)為主,主要分成3類:為企業(yè)開發(fā)應用、開發(fā)通用應用(放到Android Market或者其他App Market銷售)以及游戲開發(fā)(放到Android Market或者其他App Market銷售)。第一類開發(fā)者一般身處規(guī)模較大的公司,這些公司主要為自有品牌或者其他品牌設計手機或者平板電腦的總體方案。除了根據(jù)需求對系統(tǒng)進行定制外,更多的工作在于為這些系統(tǒng)編寫定制的應用。第二類開發(fā)者,一般處于創(chuàng)業(yè)型公司或者是獨立開發(fā)者,他
21、們的盈利方式主要是2種:為國外公司進行外包開發(fā),或者通過Google的移動廣告(AdMob)通過廣告點擊分成。而理論上的通過付費下載的形式來盈利的,現(xiàn)在國內(nèi)鮮見成功者。第三類開發(fā)者,目前和第二類開發(fā)者類似。</p><p> 北京時間4月15日晚間消息,移動應用分析公司App Annie今日發(fā)布報告稱,今年第一季度,谷歌Google Play應用商店在下載量方面依舊主導全球市場。報告稱,第一季度Google P
22、lay全球應用下載量較App Store高出45%,這主要得益于新興市場的推動,如俄羅斯、巴西、墨西哥和土耳其,其發(fā)展速度令無數(shù)人驚嘆,而Android產(chǎn)品占中國整體智能手機銷量的更是令其他系統(tǒng)無法企及,這些數(shù)字意味著龐大的市場,自然能讓應用開發(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)容與目標</b></p><p> 根據(jù)如今安卓設備的普及,以及現(xiàn)如今人們越發(fā)的重視身體的健康,開始在閑暇的時間開展一些體育活動,一些與健康相關的安卓應用被人們需要,也更
24、顯現(xiàn)出它們的實用性。而我開發(fā)的則是一款基于安卓的跑步軟件。它可以實現(xiàn)利用GPS以及百度地圖API實現(xiàn)記錄用戶跑步路徑以及跑步距離的功能。</p><p><b> 理論技術基礎</b></p><p><b> 理論基礎</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 為了達到商業(yè)應用,必須移除被GNU
26、 GPL授權證所約束的部份,例如Android將驅動程序移到 Userspace,使得Linux driver 與 Linux kernel徹底分開。Bionic/Libc/Kernel/ 并非標準的Kernel header files。Android 的 Kernel header 是利用工具由 Linux Kernel header 所產(chǎn)生的,這樣做是為了保留常數(shù)、數(shù)據(jù)結構與宏。</p><p> And
27、roid 的 Linux kernel控制包括安全(Security),存儲器管理(Memory Management),程序管理(Process Management),網(wǎng)絡堆棧(Network Stack),驅動程序模型(Driver Model)等。下載Android源碼之前,先要安裝其構建工具 Repo來初始化源碼。Repo 是 Android 用來輔助Git工作的一個工具。</p><p><b&
28、gt; 后綴簡介</b></p><p> APK是安卓應用的后綴,是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文件結構</b></p><p> 一個APK文件結構為:</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、注:編譯后的二進制資源文件)。</p><p> 總結下我們發(fā)現(xiàn)Android在運行一個程序時首先需要UnZip,然后類似Symbian那樣直接執(zhí)行安裝,和Windows Mobile中的PE文件有區(qū)別,這樣做對于程序的保密性和可靠性不是很高,通過dexdump命令可以反編譯,但這樣做符合發(fā)展規(guī)律,微軟的 Windows Gadgets或者說WPF也采用了這種構架方式。</p><p>
32、 在Android平臺中dalvik vm的執(zhí)行文件被打包為apk格式,最終運行時加載器會解壓然后獲取編譯后androidmanifest.xml文件中的permission分支相關的安全訪問,但仍然存在很多安全限制,如果你將apk文件傳到/system/app文件夾下會發(fā)現(xiàn)執(zhí)行是不受限制的。</p><p> 最終我們平時安裝的文件可能不是這個文件夾,而在android rom中系統(tǒng)的apk文件默認會放入這
33、個文件夾,它們擁有著root權限。</p><p><b> 硬件抽像層</b></p><p> Android 的HAL(硬件抽像層)是能以封閉源碼形式提供硬件驅動模塊。HAL 的目的是為了把 Android framework 與 Linux kernel 隔開,讓 Android 不至過度依賴 Linux kernel,以達成 Kernel indepen
34、dent 的概念,也讓 Android framework 的開發(fā)能在不考量驅動程序實現(xià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)與應用程序的溝通橋梁,應用分為兩層:函數(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作為基礎多媒體框架。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功能相當,但相較于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應用程序都用一個自屬的Dalvik虛擬機來運行,讓系統(tǒng)在運行程序時可達到優(yōu)化。Dalvik 虛擬機并非運行Java字節(jié)碼(Bytecode),而是運行
40、一種稱為.dex格式的文件。</p><p><b> 安全權限機制</b></p><p> Android本身是一個權限分立的操作系統(tǒng)。在這類操作系統(tǒng)中,每個應用都以唯一的一個系統(tǒng)識別身份運行(Linux用戶ID與群組ID)。系統(tǒng)的各部分也分別使用各自獨立的識別方式。Linux就是這樣將應用與應用,應用與系統(tǒng)隔離開。</p><p>
41、 系統(tǒng)更多的安全功能通過權限機制提供。權限可以限制某個特定進程的特定操作,也可以限制每個URI權限對特定數(shù)據(jù)段的訪問。</p><p> Android安全架構的核心設計思想是,在默認設置下,所有應用都沒有權限對其他應用、系統(tǒng)或用戶進行較大影響的操作。這其中包括讀寫用戶隱私數(shù)據(jù)(聯(lián)系人或電子郵件),讀寫其他應用文件,訪問網(wǎng)絡或阻止設備待機等。</p><p> 安裝應用時,在檢查程序簽
42、名提及的權限,且經(jīng)過用戶確認后,軟件包安裝器會給予應用權限。從用戶角度看,一款Android應用通常會要求如下的權限:</p><p> 撥打電話、發(fā)送短信或彩信、修改/刪除SD卡上的內(nèi)容、讀取聯(lián)系人的信息、讀取日程信的息,寫入日程數(shù)據(jù)、讀取電話狀態(tài)或識別碼、精確的(基于GPS)地理位置、模糊的(基于網(wǎng)絡獲取)地理位置、創(chuàng)建藍牙連接、對互聯(lián)網(wǎng)的完全訪問、查看網(wǎng)絡狀態(tài),查看WiFi狀態(tài)、避免手機待機、修改系統(tǒng)全局
43、設置、讀取同步設定、開機自啟動、重啟其他應用、終止運行中的應用、設定偏好應用、震動控制、拍攝圖片等。</p><p> 一款應用應該根據(jù)自身提供的功能,要求合理的權限。用戶也可以分析一款應用所需權限,從而簡單判定這款應用是否安全。如一款應用是不帶廣告的單機版,也沒有任何附加的內(nèi)容需要下載,那么它要求訪問網(wǎng)絡的權限就比較可疑。</p><p><b> 百度地圖定位</b
44、></p><p> 百度地圖Android定位SDK是利用設備當前的GPS信息(GPS定位),基站信息(基站定位)和Wi-Fi信息(Wi-Fi定位)完成定位的。開發(fā)者在應用中成功集成百度定位SDK以后,既可以方便的通過定位SDK的接口向百度定位服務請求位置信息。</p><p> 定位SDK會根據(jù)設備當前的實際情況(如是否開啟GPS,是否連接網(wǎng)絡,是否掃描到Wi-Fi信息等)生
45、成定位依據(jù),并根據(jù)開發(fā)者設置的實際定位策略(包括三種:高精度模式,低功耗模式,僅用設備模式)進行定位。</p><p><b> 技術基礎</b></p><p> 本次開發(fā)主要用到Android SDK以及百度地圖的API,開發(fā)工具采用Eclipse導入Android開發(fā)包、百度地圖API以及百度定位技術的API,如圖2.2</p><p&g
46、t; 而在安卓應用的開發(fā)過程中,需要使用的安卓模擬器,而本次開發(fā)前期所使用到的則是Android自帶模擬器。自帶的模擬器主要用于檢查控件的功能以及設計是否完善。由于本次開發(fā)需要用到GPS以及移動網(wǎng)絡的支持,開發(fā)中主要功能的測試依賴于移動安卓設備。選用的設備為三星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萬像素的前置攝像頭,支持藍牙4.0技術和NFC近場通訊等功能。上市時預載的系統(tǒng)是 Android4.2.2。使用的設備定位以及對軟件
48、支持方面能夠非常出色的滿足開發(fā)要求,測試是開發(fā)中不可忽視的重要環(huán)節(jié)。</p><p><b> 系統(tǒng)分析與設計</b></p><p><b> 需求分析</b></p><p><b> 編寫目的</b></p><p> 現(xiàn)在的人們越來越重視健康,因此出現(xiàn)了許多跑步
49、愛好者。而他們需要一些工具來記錄自己跑過的路徑和跑步的距離,以此來判斷自己的運動程度是否達到自己滿意的程度。而現(xiàn)在多數(shù)人都擁有Android設備,并且考慮到Android的開源性,Android的開發(fā)相對比較實際。所以本次要開發(fā)一個基于Android系統(tǒng)的跑步軟件。</p><p><b> 術語定義 </b></p><p> Activity: Ac
50、tivity是Android組件中最基本也是最為常見用的四大組件(Activity,Service服務,Content Provider內(nèi)容提供者,BroadcastReceiver廣播接收器)之一。Activity是一個應用程序組件,提供一個屏幕,用戶可以用來交互為了完成某項任務。Activity中所有操作都與用戶密切相關,是一個負責與用戶交互的組件,可以通過setContentView(View)來顯示指定控件。在一個androi
51、d應用中,一個Activity通常就是一個單獨的屏幕,它上面可以顯示一些控件也可以監(jiān)聽并處理用戶的事件做出響應。Activity之間通過Intent進行通信。</p><p> Intent:Intent(意圖)主要是解決Android應用的各項組件之間的通訊。Intent負責對應用中一次操作的動作、動作涉及數(shù)據(jù)、附加數(shù)據(jù)進行描述,Android則根據(jù)此Intent的描述,負責找到對應的組件,將 Intent傳
52、遞給調(diào)用的組件,并完成組件的調(diào)用。因此,Intent在這里起著一個媒體中介的作用,專門提供組件互相調(diào)用的相關信息,實現(xiàn)調(diào)用者與被調(diào)用者之間的解耦。</p><p> 百度定位SDK: 百度地圖Android定位SDK是為Android移動端應用提供的一套簡單易用的LBS定位服務接口,專注于為廣大開發(fā)者提供最好的綜合定位服務,通過使用百度定位SDK,開發(fā)者可以輕松為應用程序實現(xiàn)智能、精準、高效的定位功能。<
53、/p><p> 百度地圖SDK:百度地圖 Android SDK是一套基于Android 2.1及以上版本設備的應用程序接口。您可以使用該套 SDK開發(fā)適用于Android系統(tǒng)移動設備的地圖應用,通過調(diào)用地圖SDK接口,您可以輕松訪問百度地圖服務和數(shù)據(jù),構建功能豐富、交互性強的地圖類應用程序。</p><p> API:API(Application Programming Interfa
54、ce,應用程序編程接口)是一些預先定義的函數(shù),目的是提供應用程序與開發(fā)人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機制的細節(jié)。</p><p><b> 總體設計</b></p><p><b> 系統(tǒng)功能</b></p><p> 針對本系統(tǒng)的設計,主要實現(xiàn)兩個功能:</p&g
55、t;<p> 用戶在使用時,可以通過地圖隨時查看跑步的路徑</p><p> 用戶在使用時,可以隨時查看自己已經(jīng)跑過的距離</p><p> 通過這兩個功能可以讓用戶做到對自己的運動狀況有所掌控,對自己的運動情況心中有數(shù)。</p><p><b> 軟件結構</b></p><p> 本系統(tǒng)共有一
56、個Activity,在這個Activity中要實現(xiàn)查看地圖,查看跑步距離。則要分出地圖定位模塊,距離計算以及路程記錄模塊。</p><p><b> 程序流程圖</b></p><p> 當用戶進入到界面后,選擇開始按鈕,則開始計時并且記錄跑步的數(shù)據(jù),在界面上輸出用戶跑步的距離;這時候用戶可以選擇查看地圖或者暫停;當查看地圖用戶選擇查看地圖后,可以看到自己跑步的路
57、線,可以對地圖進行縮放;然后用戶可以關閉地圖,回到主界面,使地圖在后臺運行;最后用戶可以選擇關閉應用程序。</p><p><b> 詳細設計</b></p><p><b> 總體界面設計</b></p><p><b> 主界面</b></p><p><b&g
58、t; 開始跑步界面</b></p><p><b> 地圖界面</b></p><p><b> 模塊功能設計</b></p><p> 系統(tǒng)分為兩個模塊:定位模塊與繪制地圖模塊</p><p> 雖然分為兩個模塊,但是兩個模塊之間并不是完全沒有關聯(lián),因為在定位的同時要繪制用戶
59、經(jīng)過的線路。而且記錄用戶跑步的距離并不能只記錄用戶的起點和終點,因為百度地圖計算的是兩點之間的直線距離,只是依據(jù)起點和終點來計算將會造成計算出的距離與用戶實際跑步的距離不相符合的情況。而這里用到了數(shù)學中“微量元素”的思想。記錄用戶短時間內(nèi)的起點與終點之間的距離,然后將這些短時間運動的距離相加最終可近似的得到用戶跑步的最終距離。這樣的方式所得到的距離誤差小到可以忽略不計,而且繪制出來的跑步路徑也最接近用戶真實的跑步路線。</p>
60、;<p><b> 定位模塊</b></p><p> 這個模塊中需要初始化地圖信息以及定位信息,設置定位相關的參數(shù),并且在用戶開始跑步后立即啟動定位功能。而這個定位相應的用到了百度定位SDK以及百度地圖SDK。通過調(diào)用百度地圖的接口,可以實時獲得用戶當前的位置,即用戶當前位置的經(jīng)度緯度坐標。</p><p> 在這個模塊中,將地圖以及定位信息初始
61、化,同時設置按鈕的監(jiān)聽,一旦用戶開始跑步,立即開啟定位功能,在后臺每隔很短的一段時間獲取用戶的經(jīng)度緯度坐標。</p><p><b> 繪制地圖模塊</b></p><p> 這個模塊中要繪制用戶跑步的路徑,將其在百度地圖上標記出來,并且同時統(tǒng)計用戶跑步的距離。計算距離的方式上文中已經(jīng)說明,在此不再贅述。</p><p> 這并不是一個獨
62、立的模塊,這個模塊需要在上一個模塊的基礎上來操作。而繪制的路線相當于在百度地圖上新增加的圖層上進行繪制。但是在用戶看來只是一個圖層。而繪制路線的方式也是用折線來近似表示曲線,在視覺上看來并沒有偏差。而繪制路線以及計算距離需要用到百度地圖API,對百度地圖提供的接口加以更改就可以達到本次開發(fā)的目的。</p><p><b> 系統(tǒng)實現(xiàn)</b></p><p><
63、b> 主要界面</b></p><p> 界面大約有三個主要的界面,分別為主界面,跑步開始界面以及查看地圖界面。</p><p><b> 主界面</b></p><p> 當用戶打開應用便進入主界面,在這里用戶可以開始跑步,也可以退出應用。</p><p><b> 開始跑步界面&
64、lt;/b></p><p> 跑步開始便顯示用戶跑步的距離,時間等信息,詳細解說如下圖:</p><p><b> 查看地圖</b></p><p> 查看地圖界面,在這里用戶可以方便的查看到自己跑步所經(jīng)過的路徑,詳細解說見下圖:</p><p><b> 代碼結構</b></
65、p><p> 本次開發(fā)有一個Activity,除此之外還有一個用來繪制路線圖的類,具體如下:</p><p> MapActivity類:繼承android.app.Activity,本Activity中需要初始化地圖還有定位信息,并且為地圖設置監(jiān)聽函數(shù),每隔一秒鐘更新一次用戶的位置信息,并且更新用戶路線還有用戶跑步距離等信息。具體介紹如下:</p><p><
66、;b> 包含兩個內(nèi)部類:</b></p><p> locationOverlay類:繼承com.baidu.mapapi.map.MyLocationOverlay,這個類是用來給地圖添加泡泡圖層,即用戶觸摸地圖上當前位置點時會彈出一個圖層,告知用戶這個點為現(xiàn)在所處的位置。</p><p> MyLocationListenner類:實現(xiàn)com.baidu.loc
67、ation.BDLocationListener接口,BDLocationListener接口有2個方法需要實現(xiàn):</p><p> onReceiveLocation方法:接收異步返回的定位結果,參數(shù)是BDLocation類型參數(shù)。 </p><p><b> 主要代碼:</b></p><p> //判斷是否是第一次定位,第一次則給前
68、一次定位坐標(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> //獲取當前位置信息</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查詢結果,參數(shù)是BDLocation類型參數(shù)。</p><p><b> 主要函數(shù):</b></p><p> onCreate方法:OnCreate()不產(chǎn)生窗口,只是在窗口顯示前設置窗口的屬性如風格、位置等,Create()負責注冊并產(chǎn)
72、生窗口,是整個Activity的入口。在這里我們初始化了地圖以及定位信息的參數(shù)。</p><p><b> 主要代碼:</b></p><p> super.onCreate(savedInstanceState);//調(diào)用父類onCreate函數(shù)</p><p> //初始化地圖管理類對象,獲取當前的Application,初始化地圖&
73、lt;/p><p> mBMapMan=new BMapManager(getApplication());</p><p> mBMapMan.init(null);</p><p> setContentView(R.layout.activity_map);//設置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) ;//關閉地圖按鈕</p><p> ed = (EditText) findViewById(R.id.map_showdistance) ;//顯示距離文本</p><p> di
77、stance = 0 ;//初始化距離參數(shù)</p><p> this.firstTime = true ;//初始化標記是否是第一次定位</p><p> //設置按鈕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> //設置啟用內(nèi)置的縮放控件 </p><p> MapController mMapController=mMapView.getController(); </p><p> onClick方法:這個是控件的觸摸事件函數(shù),當觸摸控件時便執(zhí)行這個函數(shù)。這個函數(shù)的主題其實是switch結構,用來判斷控件是否被觸摸,相應的執(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"); //設置坐標類型</p><p> option.setScanSpan(1000);//設置定位時間間隔</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ù)據(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)的,也是保護現(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類:在這個類中對圖層進行操作
103、,可以在圖層上繪制圖形,這里主要是繪制直線,同時也記錄直線兩端之間的距離,函數(shù)具體介紹如下:</p><p> DrawGraphics方法:構造方法,在這里初始化一些需要的參數(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> //當前位置信息</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> //構建線</b></p><p
109、> Geometry lineGeometry = new Geometry();</p><p><b> //設定折線點坐標</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> //設定樣式</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> //起點坐標</b></p><p> GeoPoint start = p1;</p><p><b> //終點坐標</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ù)構建一個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ā)的準備工作,百度地圖的使用需要去百度地圖的官方網(wǎng)站去申請一個唯一的密鑰才可以在開發(fā)中合法使用百度地圖。(申請密鑰的方法見附錄)</p><p> 在開發(fā)過程中由于存在兩種獲取SHA1值的方式,而本次開發(fā)遇到兩種方法得到的SHA1值不一致的情況。導致按照正確步驟申請的密鑰也不能夠正常使用的情況,最終發(fā)現(xiàn)系統(tǒng)本身的密鑰庫與Eclipse自帶的密鑰庫并不
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件工程畢業(yè)論文-android跑步應用開發(fā)
- android應用開發(fā)基礎習題
- android手機地圖應用開發(fā)
- 《android應用開發(fā)》課程標準
- android移動應用開發(fā)習題答案
- android手機地圖應用開發(fā)論文
- android手機地圖應用開發(fā)論文.doc
- android應用開發(fā)經(jīng)典入門教程
- android手機地圖應用開發(fā)論文.doc
- 移動應用03_android的smsmms應用開發(fā)
- android手機地圖應用開發(fā)【畢業(yè)論文】
- 淺談surfaceview在android開發(fā)中的應用
- android實現(xiàn)天氣課表的應用開發(fā)4
- 中睿it培訓android高級應用開發(fā)課程
- 用phonegap+jquerymobile開發(fā)android應用實例
- android手機地圖應用開發(fā)【畢業(yè)論文】
- android教程之開發(fā)移動 web ajax 應用
- 基于android的信管專業(yè)論壇應用開發(fā)
- android開發(fā)秘籍
- 基于Android系統(tǒng)的地鐵導航應用開發(fā).pdf
評論
0/150
提交評論