馮玉平,王曙光
(1.西安郵電大學(xué)計(jì)算機(jī)學(xué)院,陜西 西安 710061;2.西安郵電大學(xué)自動(dòng)化學(xué)院,陜西 西安 710121)
由于Android 系統(tǒng)的免費(fèi)開(kāi)源、開(kāi)發(fā)維護(hù)成本低、使用簡(jiǎn)單等特點(diǎn),因此被廣泛作為移動(dòng)智能應(yīng)用的開(kāi)發(fā)平臺(tái)[1-3]。近年來(lái)GPS 和北斗衛(wèi)星導(dǎo)航系統(tǒng)的定位服務(wù)[4-7]在手機(jī)終端應(yīng)用中更是非常流行,手機(jī)移動(dòng)定位早已成為了人們出行旅游、查找路線、景點(diǎn)、美食等位置信息的好幫手,現(xiàn)如今市面上許多廣告、網(wǎng)絡(luò)、雜志等信息,除了提供名勝古跡或商家的地址、電話等信息外,還會(huì)附上經(jīng)緯度坐標(biāo)[8],方便人們直接輸入坐標(biāo),便可通過(guò)衛(wèi)星導(dǎo)航系統(tǒng)指引到目的地。
因此,本文描述了基于Android 平臺(tái)、采用Google Android SDK、Eclipse、ADT 等開(kāi)發(fā)包和開(kāi)發(fā)工具,并與Google 的網(wǎng)絡(luò)服務(wù)Google Map 相結(jié)合,實(shí)現(xiàn)手機(jī)地圖搜索定位[9]應(yīng)用的開(kāi)發(fā),該軟件設(shè)計(jì)2 個(gè)Edit-Text 可供用戶輸入經(jīng)緯度坐標(biāo),實(shí)現(xiàn)通過(guò)手機(jī)查找目標(biāo)位置信息或定位用戶當(dāng)前所在位置,滿足了手機(jī)用戶基本的地圖服務(wù)需求。
開(kāi)發(fā)一個(gè)Android 應(yīng)用程序首先需要搭建Android 運(yùn)行環(huán)境,即下載與此壞境相關(guān)的各種軟件,如Eclipse、JDK、Android SDK。Android 平臺(tái)下的應(yīng)用程序都是采用Java 語(yǔ)言編寫(xiě)的,所以首先需要安裝JDK,用以支持Android 和Eclipse,然后解壓Eclipse開(kāi)發(fā)工具到指定的目錄即可,無(wú)需安裝。接下來(lái)要為Eclipse 安裝ADT 插件,打開(kāi)Eclipse,在菜單欄上依次選擇help >>Install NewSoftWare,點(diǎn)擊Add 按鈕,輸入站點(diǎn)名,進(jìn)入下一步,同意安裝條款即可在線安裝ADT。再配置Android SDK,點(diǎn)擊菜單window >>preferences,點(diǎn)擊Browse 選擇剛才Android SDK 的解壓目錄。最后還需要?jiǎng)?chuàng)建Android 模擬器AVD,這樣整個(gè)開(kāi)發(fā)環(huán)境就配置完成[10]。
系統(tǒng)基于Android 平臺(tái),通過(guò)申請(qǐng)Google Map API Key 實(shí)時(shí)調(diào)用Google Map,在此基礎(chǔ)上進(jìn)行手機(jī)定位軟件的主界面和各功能模塊的相關(guān)開(kāi)發(fā)。
基于Goole Map 服務(wù)的應(yīng)用程序開(kāi)發(fā),在開(kāi)發(fā)之前需申請(qǐng)一組驗(yàn)證過(guò)的Map API Key,而要獲取這個(gè)密鑰首先得獲取debug.keystore MD5 指紋,然后再打開(kāi)瀏覽器,進(jìn)入谷歌網(wǎng)頁(yè)登錄自己的谷歌賬號(hào),輸入網(wǎng)址:http://code.google.com/android/maps-api-signup.html,在輸入框中填寫(xiě)MD5 指紋,即可獲得API Key。在XML 布局文件中進(jìn)行API Key 的相關(guān)配置即可使用。
在main.xml 布局文件中,總體布局為垂直的分布線性布局,在此布局中還需要聲明2 個(gè)水平分布的線性布局,第一個(gè)水平布局用于添加2 個(gè)用于分別顯示經(jīng)緯度的靜態(tài)文本TextView 控件和2 個(gè)用來(lái)供用戶輸入的經(jīng)緯度的EditText 控件;第二個(gè)水平布局包需要添加一個(gè)點(diǎn)擊查詢Button 和一組用于切換普通視圖和衛(wèi)星視圖的RadioButton,這2 個(gè)RadioButton需要編制在一個(gè)RadioGroup 中,同一時(shí)刻一個(gè)Radio-Group 中只能有一個(gè)按鈕處于選中狀態(tài)[11-13]。最后還要聲明一個(gè)MapView 控件用于添加前面申請(qǐng)的Google Map API Key。
本程序創(chuàng)建了2 個(gè)功能類,一個(gè)是繼承MapActivity 的Googlemap 子類,在程序中需要使用MapView來(lái)顯示地圖信息,而MapView 只能用在Mapactivity中,這是因?yàn)镸apView 需要通過(guò)后臺(tái)的線程來(lái)連接網(wǎng)絡(luò)或者文件系統(tǒng),而這些線程需要MapActivity 來(lái)管理。另一個(gè)是繼承Overlay 的GoogelOverLay 子類,該類主要實(shí)現(xiàn)的功能是在MapView 上繪制一個(gè)額外的能指定經(jīng)緯度位置方向朝下的箭頭,標(biāo)明該位置在地圖中的確切位置,并將其添加到MapView 的Overlay 列表中才可以被繪制,具體代碼實(shí)現(xiàn)如下:
繼承Mapactivity 的子類主要實(shí)現(xiàn)以下功能:
1)判斷輸入經(jīng)緯度是否有效。
當(dāng)用戶點(diǎn)擊查詢按鈕后,系統(tǒng)通過(guò)查詢B-utton的對(duì)象調(diào)用為此按鈕添加的setOnClickListner(new View.OnClickListener()...)監(jiān)聽(tīng)器函數(shù),該函數(shù)在重寫(xiě)onClick 方法中首先獲得經(jīng)緯度坐標(biāo)值,然后通過(guò)if 語(yǔ)句函數(shù)來(lái)判斷輸入的經(jīng)緯度是否有效,代碼實(shí)現(xiàn)如下:
2)更新并縮放地圖。
若輸入的經(jīng)緯度坐標(biāo)無(wú)效,則要求輸入正確的經(jīng)緯度坐標(biāo),若有效,則調(diào)用updateMapView()方法更新MapView 視圖中的內(nèi)容,該方法將經(jīng)緯度坐標(biāo)轉(zhuǎn)換為GeoPoint 對(duì)象后,再調(diào)用MapController 的animateTo()方法將地圖的中心點(diǎn)移到GeoPoint 的坐標(biāo)上,同時(shí)調(diào)用繼承Overlay 的子類將箭頭圖片移動(dòng)到指定的坐標(biāo)位置,并設(shè)置displayZoomCont-rols(true)顯示地圖的放大和縮小按鈕,代碼實(shí)現(xiàn)如下:
3)切換視圖。
在切換視圖過(guò)程中,程序通過(guò)RadioGroup 的對(duì)象來(lái)調(diào)用為此單選按鈕組添加的setOnChecked-ChangeListner(new OnCheckedChangeListener()...)監(jiān)聽(tīng)器函數(shù),并通過(guò)if 語(yǔ)句函數(shù)來(lái)實(shí)現(xiàn)判斷用戶按下的是普通視圖按鈕還是衛(wèi)星視圖按鈕。
因?yàn)榈貓D使用的是Google Map API,不是Android 類庫(kù),所以完成了功能代碼開(kāi)發(fā)之后需在AndroidManifest.xml 文件中添加Google Map 相關(guān)的類庫(kù):<uses-library android:name="com.google.android.maps"/ >和添加訪問(wèn)網(wǎng)絡(luò)的權(quán)限<uses-permissionan-droid:name=" android.permission.INTERNET"/ >。整體設(shè)計(jì)流程如圖1 所示。
圖1 設(shè)計(jì)流程圖
為了驗(yàn)證該軟件在輸入經(jīng)緯度值后能否正確地定位顯示,本文首先通過(guò)UM220 BD2/GPS 導(dǎo)航授時(shí)平臺(tái)獲取到西安郵電大學(xué)這個(gè)位置的Longtitude:108.949339100°E 和Latitude:34.214819350°N,該平臺(tái)是一款集于BD2 和GPS 雙系統(tǒng)模塊的定位導(dǎo)航開(kāi)發(fā)板,定位精度優(yōu)于20 m。然后利用智能手機(jī)加載本程序,開(kāi)啟手機(jī)的網(wǎng)絡(luò)連接,將上述經(jīng)緯度值輸入該軟件中,如圖2 所示,準(zhǔn)確地顯示了西安郵電大學(xué)的位置,同時(shí)在測(cè)試的過(guò)程中能夠靈活地對(duì)地圖進(jìn)行拖拉、縮放和快速地切換普通視圖和衛(wèi)星視圖,達(dá)到了預(yù)期效果。
圖2 普通視圖
通過(guò)申請(qǐng)Google Map API Key,在智能手機(jī)內(nèi)可以實(shí)時(shí)調(diào)用Google Map,從而實(shí)現(xiàn)實(shí)時(shí)定位和導(dǎo)航[14-17]。本文首先介紹了Android 運(yùn)行壞境的搭建和Map API Key 的申請(qǐng),然后根據(jù)Android 和Google Map 提供的編程應(yīng)用程序接口,設(shè)計(jì)并實(shí)現(xiàn)了基于Android 平臺(tái)能以經(jīng)緯度查詢目標(biāo)的手機(jī)定位軟件。以Android 智能手機(jī)為平臺(tái),借助Google Maps 提供的地圖數(shù)據(jù)服務(wù),為用戶外出旅行,查找目標(biāo)位置實(shí)現(xiàn)地圖的定位顯示,具有一定的實(shí)用價(jià)值。
[1]陳莉君,張超.Android 進(jìn)程間通信Binder 擴(kuò)展模型的設(shè)計(jì)與實(shí)現(xiàn)[J].西安郵電學(xué)院學(xué)報(bào),2013,18(3):96-99.
[2]劉建華,田歲苗,趙勇.基于Android 的智能家居系統(tǒng)設(shè)計(jì)[J].西安郵電大學(xué)學(xué)報(bào),2013,18(4):71-74.
[3]楊帆,趙東東.基于Android 平臺(tái)的WiFi 定位[J].電子測(cè)量技術(shù),2012,35(9):116-119.
[4]龍昌生.北斗/GPS 雙模導(dǎo)航終端關(guān)鍵模塊的設(shè)計(jì)與實(shí)現(xiàn)[D].重慶:重慶大學(xué),2011.
[5]康永,胡安平.基于網(wǎng)絡(luò)的北斗位置信息服務(wù)研究[J].全球定位系統(tǒng),2013,38(1):40-44.
[6]劉正,陳強(qiáng).基于Android 的GPS 應(yīng)用中的研究與開(kāi)發(fā)[J].中國(guó)西部科技,2010,9(32):15-16.
[7]秦超,姜良君,蔡永香.基于Android 的移動(dòng)終端GPS 測(cè)量系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[J].城市勘測(cè),2011(1):64-67.
[8]翟玉山.基于Android 平臺(tái)手機(jī)地圖的設(shè)計(jì)與實(shí)現(xiàn)[D].西安:西安電子科技大學(xué),2012.
[9]佘鳳婭.基于Android 的手機(jī)搜索定位應(yīng)用開(kāi)發(fā)[D].北京:北京郵電大學(xué),2010.
[10]黃藝鋒,閆巧.基于Android 平臺(tái)電子詞典的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用,2012,31(S2):228-232.
[11]吳亞峰,索伊娜.Android 核心技術(shù)與實(shí)例詳解[M].北京:電子工業(yè)出版社,2010:51-86.
[12]余志龍,陳昱勛,鄭名杰,等.Android SDK 開(kāi)發(fā)范例大全[M].北京:人民郵電出版社,2009.
[13]葉達(dá)峰.Eclipse 編程技術(shù)與實(shí)例[M].北京:人民郵電出版社,2006.
[14]陳婷,暢偉杰,張立臣.基于Google Map 的西安旅游電子地圖設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(9):230-233.
[15]吳肖,彭璇,朱明磊.基于Google Map API 的校園電子地圖開(kāi)發(fā)[J].測(cè)繪工程,2010,19(3):35-38.
[16]周鵬,陳紅順,尹菲.Google Maps API 技術(shù)在移動(dòng)終端上的GIS 應(yīng)用[J].測(cè)繪通報(bào),2012(3):95-96.
[17]江南,白小雙,曹亞妮,等.基礎(chǔ)電子地圖多尺度顯示模型的建立與應(yīng)用[J].武漢大學(xué)學(xué)報(bào)(信息科學(xué)版),2010,35(7):768-772.