本筆記將學習如何使用Google Map服務。主要參考來源為:https://developers.google.com/maps/documentation/android/start?hl=zh-CN。要在模擬器和實際手機上跑通還是費了一番周折。最新的Google
Maps Android API v2已經將map服務合并到Google Play services中,但是國內手機並不提供Google Play store,也不提供Google Play services。國內的手機是否不需要進行CTS測試?換言之,本次學習對於在國內市場提供應用並沒有實際意義,因為你不可能要求使用者去進行額外的安裝,但是將學習手機應用如何使用互連網服務。要在手機上跑Google地圖服務,涉及的步驟比較多。
一、準備開發環境
1、在Eclipse上安裝Google Play Services SDK。位於extra,見。安裝後位於sdk/extras/google/google_play_services/
2、安裝SDK後,將Make a copy of the Google Play services的lib project拷貝到我們的workspace中,目的是為了在我們的project中可以引入該lib。在Eclise中File -> Import, 選擇Android -> Existing Android Code into Workspace,
在SDK安裝的目錄下,選擇該lib(google-play-services_lib),將其import。
3、要使我們的project可以使用google play service lib,是通用的將library project加入到Android project的操作,目地為了在開發的應用中使用來自lib project的共用代碼。在Eclipse的包瀏覽(一般位於左側)中,選擇我們的項目,按右鍵-> Properties -> 在左邊屬處選擇Android,在右邊選擇Library
-> 在Project Selection 對話方塊中點擊Add -> 從可選的lib project中選擇目標。如
二、準備調測環境
無論採用模擬器還是真實手機作為調測環境,需要確保裝置已經安裝com.android.vending.apk(Google play store)和com.google.android.gms.apk(Google play services),然而模擬器上並沒有包括這兩個包,而國內手機也不包含著兩個apk,這就是為何我在篇首感歎。要安裝這個兩個需要在網上進行search。需要注意com.google.andriod.gms.apk在2013年5月30有update。由於和Google線上提供的服務相關,這個包必須是最新,才能匹配現有的線上服務。在代碼中可能進行檢測:
GooglePlayServicesUtil.isGooglePlayServicesAvailable ( getApplicationContext() )
如果返回ConnectionResult: SUCCESS表示可以正常使用。其他可能返回有SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID。下面左圖是SERVICE_MISSING,右圖是SERVICE_VERSION_UPDATE_REQUIRED的情況,都不能正常使用Map業務。上面雖然有兩個button,實際不起作用,估計是無法串連到伺服器導致。據說小米手機的市集可以跳轉到Google
Play,可能小米和Google達成某些協議,可能小米手機上沒有什麼問題。
要安裝這個apk時最為麻煩的。最後的解決辦法是先在模擬器上先安裝華為的智匯雲,在上面尋找這兩個應用。由於應用來源不正規,所以不建議在真實手機上安裝。模擬器上安裝apk沒有網上說的那麼複雜,要進入adb shell處理。在模擬器上的瀏覽器直接開啟相關的網頁,下載apk,然後點擊進行安裝即可,和手機安裝沒區別。安裝成功後,可以看到App增加了Google Settings和Play Store兩個。
還有一個更為簡單的方法。用gmail帳號登入,然後找到應用下載,在那裡可以下載Google Map,官方版本比較安全。
三、擷取Google Map API的key
要通過Google Map API訪問Google線上的地圖服務,需要Google Map API Key。這個Key擷取是免費的,開發人員只要具有Gmail的郵箱就可。所有的Android app都必須由數位憑證簽發,開發人員持有私人private key。由於數位憑證是唯一的,作為應用的唯一標識,這是的市集可追蹤你的應用,以及追蹤你應用使用了Google Map服務。
Maps API key是基於應用的數位憑證,也成為SHA-1 fingerprint。分為debug認證和release認證,對於我們的實驗,使用debug。debug keystore檔案位於~/.android/,如果是Windows位於C:\Users\your_user_name\.android\。Linux和用下面命令獲得認證。在Windows中-keystore的參數為"C:\Users\your_user_name\.android\debug.keystore"。
keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
Keytool 是一個Java資料認證的管理工具,Keytool將密鑰(key)和認證(certificates)存在一個稱為keystore的檔案中在keystore裡,包含兩種資料:密鑰實 體(Key entity)-密鑰(secret key)或者是私密金鑰和配對公開金鑰(採用非對稱式加密)可信任的認證實體(trusted certificate entries)-只包含公開金鑰.-list 顯示密鑰庫中的認證資訊 keytool -list -v -keystore 指定keystore -storepass 密碼-alias 產生別名 每個keystore都關聯這一個獨一無二的alias,這個alias通常不區分大小寫-keystore 指定keystore -file 指定匯出的認證位置及認證名稱-storepass 密碼-keypass 指定密鑰庫的密碼(擷取keystore資訊所需的密碼)
記錄下認證指紋,用它在Google APIs Console擷取Map Key。Google API Console需要用Google帳號進行登入,也就是我們Gmail的帳號,這個網站貌似不是很穩定,有時請求需要發送多次才能成功,可能有間歇性攔截,反正多給點耐心吧。
OK,成功擷取我們的Google Map API Key。
四、使用Google Map服務
經過以上步驟,終於將整個開發環境準備好,進入代碼編寫階段。在coding的具體編寫前,首先要AndroidManifest.xml中設定相應的許可,具體如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.wei.android.beginning" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
<!-- 步驟(1)設定Google Map API v2 Key,其中com.wei.android.beginning為package的名字 -->
<permission android:name="com.wei.android.beginning.permission.MAPS_RECEIVE" android:protectionLevel="signature"/>
<uses-permission android:name="com.wei.android.beginning.permission.MAPS_RECEIVE"/>
<!-- 步驟(3)設定使用Google Map服務所需的許可 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Google Map是互連網業務,允許互連網 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 允許API檢查網路連接狀態,已確定是否可以下載資料 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><!-- 允許將Google地圖資料緩衝在SD卡上 -->
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/><!-- 允許API訪問Google的基於Web的業務 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 地圖應用經常和定位相關,允許粗定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- 允許精確定位-->
<!-- 步驟(4)Google Map v2需要OpenGL ES,需要用uses-feature中聲明 -->
<uses-feature android:glEsVersion="0x00020000" android:required="true"/>
<application ...... >
<!-- 步驟(2)設定Google Map API v2 Key -->
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="AIzaSyDPOviDLcwanPb3D3rwdqYXFn8jikGXey0"/>
<activity ......> ...... </activity>
</application>
</manifest>
使用最為簡單的的例子,在Activitiy中簡單的顯示提出。在Activitiy引用的layout.xml檔案如下:
<?xml version="1.0" encoding="utf-8"?><fragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="match_parent" android:layout_height="match_parent" android:name="com.google.android.gms.maps.MapFragment"/>
只要在activity中,將該布局引入即可。
public class MainActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}
費了好大勁,要show一下成果。顯示經度為0,維度為0的地區,請看非洲……
既然有網友問到哪去安裝Google Services,多上幾個圖。左1:沒有安裝Google Services的應用運行情況;左2:通過上文所述的應用商場找到所需,見最下兩個。再現非洲。
相關連結:
我的Android開發相關文章