2010年12月13日 星期一

Android 開發教學筆記 - 簡單設定 Google Maps

參考資料:



想要在 Android 上頭使用 Google Maps 的功能,有幾道流程:



  1. 申請 Android Maps API Key

  2. 建立使用 Google APIs 的模擬器

  3. 建立使用 Google Maps API 的 projects (在此 Build Target 使用 Google APIs/Google Inc./2.2/8 )

  4. 設定 Android Application 環境,使用 INTERNET permissions 及相關使用的 lib

  5. 設定 MapView 的 layout

  6. 設定程式碼


首先關於取得 Google Maps API Key,此部份跟一般申請上的不一樣,需使用 Android 的申請 Sign Up for the Android Maps API - Android Maps API - Google Code,此時會需要一組認證指紋(MD5),而這組序號用在開發程式的階段(debug mode),而當你要將程式上架時,必須在用另一組(release mode),細節請參考 Getting the MD5 Fingerprint of the SDK Debug Certificate,在此就依 debug mode 申請一組:


$ keytool -list -keystore ~/.android/debug.keystore
...
Certificate fingerprint (MD5): 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98


其中認證指紋(MD5)為 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98 (此為範例,請輸入自己產生的),帶著這組就可以去申請 Android Maps API Key 囉,請輸入到 My certificate's MD5 fingerprint 欄位。送出後,頁面將顯示 "您的金鑰" 、 "金鑰適合所有使用以下指紋憑證所簽署的應用程式" 和 "此處提供您 xml 配置的範例",共三筆資。請保存好,這邊只會使用"您的金鑰"。


建立 Android API 模擬器,如果你已經有設定一台可運行 Google APIs 2.2 的話,那可以略過此步。


[Eclipse]->[Window]-> [Android SDK and AVD Manager]->[New]

Name: Map
Target: Google APIs(Google Inc.) - API Level 8
    
按下 Create AVD 及建立完成


建立一個專案


[Eclipse]->[File]->[New]->[Android Project]

Project name: MyMap
Build Target: Google APIs, Google Inc., 2.2, 8
Application name: MyMap
Package name: com.test.map
Create Activity: MyMap
Min SDK Version: 8

設定完就可以按 Finish 囉


Android Project Structure


緊接著設定 Application 的權限和相關 lib 部份,請在左邊點選 AndroidManifest.xml 檔案,此時右邊視窗則顯示該檔相關的設定,可以在底部找到 Manifest/Application/Permissions/Instrumentation/AndroidManifest.xml 等子頁面切換,在此切換 AndroidManifest.xml 分頁,直接編輯此 xml 檔案,在 <application> 裡頭增加 <uses-library android:name="com.google.android.maps" /> 資訊,在 <manifest> 裡增加 <uses-permission android:name="android.permission.INTERNET" />,分別代表要使用函式庫:(com.google.android.maps)和需要使用網路資源(android.permission.INTERNET)


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.test.map"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".MyMap"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <uses-library android:name="com.google.android.maps" />
    </application>
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET" />
</manifest>


設定完應用程式執行環境後,接著設定排版部份(layout),透過左邊視窗請點選 main.xml 檔案,直接用下面的資訊覆蓋掉:


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainlayout"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.google.android.maps.MapView
        android:id="@+id/mapview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
        android:apiKey="Your Maps API Key"
    />

</RelativeLayout>


其中 Your Maps API Key 請改填"您的金鑰",如此一來即完成排版的部份


最後,則是修改程式碼的部份,請點選 MyMap.java 檔案



  1. 增加 import com.google.android.maps.*;

  2. 將 public class MyMap extends Activity 修改為 public class MyMap extends MapActivity

  3. 實做必要函數 boolean isRouteDisplayed()


完整程式碼:


package com.test.map;

import android.app.Activity;
import android.os.Bundle;
import com.google.android.maps.*;

public class MyMap extends MapActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

}


如此一來,則可以執行,並看到模擬器顯示 Google Maps 囉!


AndroidMaps


上述算是一個簡單的設定流程,但僅供了解流程而已,因為產生的程式除了呈現一個 Google Maps 外,沒有太多的互動,因此,如果想要增加一些使用者互動部份,如 Zoom In/Zoom Out,請在 onCreate 加上兩行程式碼:


MapView mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);


請記得加到 setContentView(R.layout.main); 後面,如果加在前面會導致程式 crash 喔,可以看看 setBuiltInZoomControls method for MapView causes application to crash 的敘述,避免 crash 也可以改成:


MapView mapView;
if( ( mapView = (MapView) findViewById(R.id.mapview) ) != null )
    mapView.setBuiltInZoomControls(true);


但沒擺在 setContentView(R.layout.main); 後面,還是沒用的喔。


AndroidMapsZoom


其他資料:



3 則留言:

  1. 不好意思,我跟著你的教學做,但顯示不到MAP,只顯示出一格格,請問是什麼原因呢?

    版主回覆:(08/30/2010 02:43:41 PM)


    不好意思,我對 Android 沒那麼熟,我現在只想到會不會是 main.xml (layout xml 描述檔案) 裡頭的 android:apiKey (Google Maps API Key) 沒輸入好呢?

    回覆刪除
  2. 因為你的google map初始化沒有值
    所以跑不出地圖內容
    解決方法你可以初始設中心點就可以了

    版主回覆:(03/13/2011 04:48:32 PM)


    你是幫忙回樓上的嗎 :D 感謝啊~我有一陣子沒寫 Android 了 Orz

    回覆刪除
  3. 你的文章對我很有幫助,多謝分享!

    回覆刪除