有別于傳統(tǒng)的PC或Web領(lǐng)域的應(yīng)用,有一項(xiàng)技術(shù)是只有在移動設(shè)備上才能實(shí)現(xiàn)的。那就是基于位置的服務(wù)(Location Based Services)。
由于移動設(shè)備方便攜帶,我們通過定位技術(shù)就可以隨時(shí)得知自己所在的位置。圍繞這一點(diǎn)可以開發(fā)出很多實(shí)用有趣的應(yīng)用,上至軍事導(dǎo)航偵察,下至民間外賣送餐。

· 借助百度地圖
現(xiàn)在手機(jī)地圖應(yīng)用已經(jīng)十分廣泛。和PC上的地圖相比,手機(jī)地圖能夠隨時(shí)隨地查看,并且輕松構(gòu)建出行路線。我們也完全可以在自己的Android應(yīng)用中加入地圖功能。
相比于谷歌地圖,百度地圖不僅提供了豐富的API,而且對使用沒有任何限制。所以我們就通過百度地圖將地圖功能引入到自己的程序中。

本章導(dǎo)讀:
1)申請API Key
2)顯示出地圖
3)定位到當(dāng)前位置
4)讓我顯示在地圖上
【注:您可以選擇跳讀本文,收藏備需。另,下文截圖代碼均已上傳至云盤。】
一、申請API Key
在應(yīng)用程序中加入百度地圖前,必須先申請一個(gè)API Key。你得擁有一個(gè)百度賬號才能進(jìn)行申請,如果還沒有快先注冊一個(gè)吧。
然后,我們需要注冊成為一名百度開發(fā)者。打開網(wǎng)址:
http://developer.baidu.com/user/reg ,在這里填入“*”號部分的內(nèi)容即可。

點(diǎn)擊提交,去郵箱驗(yàn)證一下就ok了。最后,訪問網(wǎng)站:
http://lbsyun.baidu.com/apiconsole/key,選擇同意百度開發(fā)者協(xié)議,會看到如下界面:

剛注冊的賬號,列表是空的。只要點(diǎn)擊創(chuàng)建應(yīng)用就可以申請API Key了。應(yīng)用名稱隨意,應(yīng)用類型選擇Android SDK,啟用服務(wù)保存默認(rèn)即可,如圖。

還剩一個(gè)發(fā)布版SHA1和包名,對嗎。點(diǎn)擊Eclipse導(dǎo)航欄的Window→Preferences→Android→Build,界面如圖:

24:2D:64:E1:0C:80:28:2A:48:56:A0:31:90:5E:D6:A1:CC:82:7E:8B 就是我們需要的SHAI指紋(當(dāng)然你的Eclipse中顯示的指紋肯定和我的不一樣)。
至于包名,就是我們創(chuàng)建的應(yīng)用程序包名。我建了一個(gè)project,命名為baiduTest2。包名就是 com.example.baidutest2。
將這兩個(gè)值填入網(wǎng)頁中對應(yīng)位置,點(diǎn)擊提交,就申請成功了。

毫無疑問,3QAgI5r6Bsc1SRZGE5upjPirAECgsbB6 就是申請到的API Key。有了它后續(xù)的地圖開發(fā)就一路順暢了。
二、顯示出地圖
建好工程,開始編碼前,還要做一件事:將百度地圖Android版的SDK準(zhǔn)備好,下載地址:http://developer.baidu.com/map/sdkandev-download.htm ,然后點(diǎn)擊一鍵下載。
下載完解壓,又有三個(gè)壓縮包。只需解壓Lib包,里面有我們需要的一切,如圖。

現(xiàn)在動動鼠標(biāo),將baidumpapi_v3_1_0.jar復(fù)制到項(xiàng)目libs目錄下。
然后在libs目錄下新建armeabi目錄,將libBaiduMapSDK_v3_1_0.so復(fù)制到新建目錄下。

順帶一提,libs目錄專門用于存放第三方Jar包;armeabi目錄專門用于存放so文件。so文件是用C/C++語言編寫的,再用NDK編譯而來。這兒的.so文件百度已經(jīng)編譯好,可以直接使用。
做了這么多準(zhǔn)備工作,終于要開始寫代碼了(敲黑板!) 修改activity_main.xml中的代碼:

在布局文件中,我們只放了一個(gè)MapView,它是百度提供的自定義控件,所以使用時(shí)要加上包名。
然后修改MainActivity中代碼:

這里的代碼也很簡單。注意一定要調(diào)用SDKInitializer的initialize()進(jìn)行初始化,并且要在setContentView()方法之前調(diào)用。
使用百度地圖還需要在AndroidManifest.xml中申明一堆權(quán)限,避免今后因權(quán)限不足導(dǎo)致程序崩潰。

最后一步很重要,就是在AndroidManifest.xml中將上一小節(jié)申請到的百度API Key配置進(jìn)去。

注意,com.baidu.lbsapi.API_KEY 這個(gè)值是固定的哦?,F(xiàn)在運(yùn)行程序,百度地圖成功顯示出來了:

三、定位到當(dāng)前位置
下面的程序建議你最好在安卓手機(jī)上運(yùn)行,能得到真實(shí)的數(shù)據(jù)位置。不過,DDMS也提供了在模擬器中模擬地理位置的功能。
目前這還只是一張默認(rèn)的地圖,顯示北京市市中心的位置。那如何才能在地圖中快速定位到自己的位置?
希望讓地圖定位到某個(gè)經(jīng)緯度上,我們需要借助LatLng類,用于存放經(jīng)緯度值。
LatLng的構(gòu)造方法接收兩個(gè)參數(shù),分別是經(jīng)度值和緯度值。下面的代碼可以將地圖定位到指定的經(jīng)緯度:

北緯39.5度,東經(jīng)116.8度這個(gè)位置就被成功定位到了。
修改MainActivity中的代碼,加入定位到我的位置功能。關(guān)鍵就是將Location對象中的地理位置信息取出并封裝到LatLng對象中。(完整代碼請看文末)

筆者現(xiàn)在在浙江省臨安市。所以重新運(yùn)行一下程序,結(jié)果如圖:

四、讓我顯示在地圖上
我們平時(shí)使用手機(jī)地圖,上面應(yīng)該會有一個(gè)小光標(biāo)用于顯示設(shè)備當(dāng)前所在的位置。如果設(shè)備正在移動(比如人正在開車),那這個(gè)光標(biāo)也會跟著移動。
百度地圖的API當(dāng)中提供了一個(gè)MyLocationData.Builder類,用來封裝設(shè)備當(dāng)前位置。這個(gè)類又提供了一個(gè)build()方法,調(diào)用它生成一個(gè)“我的位置”實(shí)例。
只要將這個(gè)實(shí)例傳入BaiDuMap的相應(yīng)方法,設(shè)備位置就顯示在地圖上了?,F(xiàn)在對MainActivity做一些修改,將Location包含的經(jīng)緯度封裝:

為了使用百度地圖的這一功能,還要事先在初始函數(shù)onCreate()中將此功能開啟:

重新運(yùn)行程序,發(fā)現(xiàn)我真的在地圖上了!

地圖可以放大、縮小,現(xiàn)在用戶可以清晰地看出自己當(dāng)前是在哪兒。
掌握好以上知識,我們已經(jīng)成功入門了。關(guān)于百度地圖的用法還有很多很多,例如將普通地圖設(shè)置為衛(wèi)星地圖、查找路線等等。


若不滿足于當(dāng)前功能,很簡單!您可以上官網(wǎng)參考開發(fā)指南:
http://developer.baidu.com/map/sdk-android.htm
這一章介紹如何將百度地圖引用到自己的應(yīng)用程序中,今后我們就可以構(gòu)建功能豐富、交互性強(qiáng)的地圖類應(yīng)用程序了。
上述源碼已經(jīng)分類打包上傳,還加入了一些沒有提及的地圖功能,供您參考。請戳:《百度地圖應(yīng)用資料》下載查收。
掌握這些方法目前來看沒有捷徑,就是猛敲代碼,多上機(jī),多編程。發(fā)現(xiàn)問題,再逐個(gè)克服。一起加油吧!
我是葉琛
一只癡迷旅行的大三編程狗