使用Google Map API v2

心鑫發表於2013-09-04

本筆記將學習如何使用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檔案如下:

[html] view plaincopy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <fragment xmlns:android="http://schemas.android.com/apk/res/android"  
  3.           android:id="@+id/map"  
  4.           android:layout_width="match_parent"  
  5.           android:layout_height="match_parent"  
  6.           android:name="com.google.android.gms.maps.MapFragment"/>  
 3.0以下系統應使用SupportMapFragment
<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.SupportMapFragment"/>


只要在activity中,將該佈局引入即可。

[java] view plaincopy
  1. public class MainActivity extends Activity {  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.main);  
  5.     }  
  6. }  

費了好大勁,要show一下成果。顯示經度為0,維度為0的地區,請看非洲……

既然有網友問到哪去安裝Google Services,多上幾個圖。左1:沒有安裝Google Services的應用執行情況;左2:通過上文所述的應用商場找到所需,見最下兩個。再現非洲。

相關連結: 我的Android開發相關文章

相關文章