Android開發筆記-使用Google地圖

※注意:本文已過時,新版API請參考官方網站

內容說明:建立私人金鑰、取得金鑰MD5、設定網路存取權限、載入Google地圖供程式使用

資料來源:Google!Android 2手機應用程式設計入門第三版

在 Google Maps Android API 更新到 v2 之後,此系列文章尚未更新,若有錯誤請多包涵。新的 API Key 取得方式可參考這篇

地圖座標

  • GPX:GPS常見的座標格式。
  • KML(Keyhole Makeup Language):Google地圖和Google Earth使用的座標格式。

要取得KML座標,可以透過Google Earth。在Google Earth中新增地標,並且在地圖圖釘上按滑鼠右鍵選擇「複製」,貼到記事本後,會看到一堆XML格式的資料(即是KML檔案),找到標籤裡的值表示經度,標籤裡的值則表示緯度。

取得金鑰的認證指紋(MD5)

在向Google申請API Key之前,我們必需要先取得自己金鑰的MD5。這裡的金鑰有兩種,一種是開發中的金鑰,另一種則是要發佈用的金鑰。如果我們一開始就使用發佈的金鑰,那麼就會無法在模擬器上顯示結果,因此在開發過程中,還是先使用臨時的金鑰來測式。要找到你開發金鑰的位置,可以開啟Eclipse > Windows > Preferences > Android > Build裡面有個debug.keystore檔案位置,即是開發用的金鑰。

取得MD5的方法可參考官方網站。由於本系列文章沒有教大家設定「環境變數」,所以這裡就寫一個批次檔(bat)給大家參考。開啟一個記事本,將下面語法貼上。修改”C:\j2sdk1.4.2_10”成自己電腦裡Java SDK的安裝路徑修,並且把”C:\Users...“改成自己電腦裡金鑰的位置。最後另存成 getDebugMD5.bat 批次檔(注意後面沒有.txt),在這個檔案上直接點擊滑鼠二下,就會在bat檔旁邊多出一個debugKey.txt,這個txt裡面就有我們要的MD5。

C:\j2sdk1.4.2_10\bin\keytool -list -keystore C:\Users\Omew\.android\debug.keystore >> debugKey.txt

如果程式已經要發佈出去了,就必需用私人金鑰重新產生MD5,再另外申請一個API Key輸入到程式中。

建立私人金鑰 (發佈到Android平台時才需要使用)

要取得私人金鑰,必需透過Java SDK來完成。詳細說明請參考官方網站,這裡只提供一個速成的範例。開啟一個記事本,將下面語法貼上。修改”C:\j2sdk1.4.2_10”成自己電腦裡Java SDK的安裝路徑修,把filename改成自己要取的金鑰檔名,並設定key_name。最後另存成 getPrivateKey.bat 批次檔(注意後面沒有.txt),在這個檔案上直接點擊滑鼠二下,系統會詢問一些關於開發者的資料與密碼,最後就會在bat檔旁邊多出一個 filename.keystore,即是私人金鑰。

C:\j2sdk1.4.2_10\bin\keytool -genkey -v -keystore filename.keystore -alias key_name -keyalg RSA -keysize 2048 -validity 10000

取得Google Maps API Key
Google提供了很多API讓程式開發者使用(參考Google code),而這裡要使用的是Google Maps API。在申請頁面可以看到要我們輸入MD5,我們只要把前面產生的MD5,例如「EB:1C:B4:95:85:C1:74:9B:F1:7D:27:70:E1:40:94:D1」,貼上送出即可。送出後即會產生一組API Key,如「0IngGLLT7wUkbXwtNMFv4NmANPStXjD06uMILxg」。

建立Google API專案

請參考前文建立一個新的專案,在建立新專案的過程中,記得「Build Target」要選擇「Google APIs」。如果你的Eclipse沒有出現Google APIs的選項,請參考第一篇重新安裝Android API。

如果在一開始新建專案的時候沒有選到Google APIs,可以到 Project > Properties > Android 重新選擇。

設定網路存取權限

由於Google地圖需要從網路載入,所以程式專案必需要設定網路存取的權限。開啟AndroidManifest.xml,加上聲明使用Google地圖的函式庫,並且在後面加入開啟網際網路使用權限:

<application ...>
        <uses-library android:name="com.google.android.maps" />
        ...
    </application>
    <uses-permission android:name="android.permission.INTERNET">
    </uses-permission>

佈屬MapView物件

要把地圖物件加入到畫面中,請先開啟res/layout/main.xml。由於這是外掛的物件,所以沒有辦法用圖形模式拉出來,因此請直接在XML的下加入標籤,並且設定apiKey為前面取得的Google Maps API Key。clickable是指使用者能不能拖移地圖(物件方法請參考官方網站):

<com.google.android.maps.MapView android:id="@+id/map"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:apiKey="0IngGLLT7wUkbXwtNMFv4NmANPStXjD06uMILxg"
    android:clickable="true"
    />

建立MapActivity

要建立地圖頁面時,請將Java檔extends MapActivity,並且根據系統指示產生相對應的程式碼。原始的空白框架如下:

package moke.test;

import com.google.android.maps.MapActivity;
import android.os.Bundle;

public class main 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() {
        // TODO Auto-generated method stub
        return false;
    }
}

完成之後就可以先執行看看了。如果是用虛擬機器執行,記得Target要選擇Google APIs(請參考安裝開發環境)。

控制地圖

在程式中進行地圖的基本控制,可以參考下面的程式碼,詳細說明請參考官方網站

package moke.test;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import android.os.Bundle;

public class main extends MapActivity {
    private MapView map;            //宣告google map物件
    private MapController mapController;    //宣告google map控制物件

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        map = (MapView) findViewById(R.id.map); //載入google map物件
        mapController = map.getController();    //設定控制的map物件
        setupMap();
    }

    private void setupMap() {
        setupMap(120.2126014372952, 22.99724179778664); //設定地圖預設值
    }
    private void setupMap(double longitude, double latitude) {
        GeoPoint station = new GeoPoint(
                    (int)(latitude * 1000000),
                    (int)(longitude * 1000000)
        );          //設定地圖座標值:緯度,經度
        
        map.setTraffic(true);               //設定地圖檢示模式
        //.setTraffic(true):一般地圖
        //.setSatellite(true):衛星地圖
        //.setStreetView:街景圖
        
        mapController.setZoom(17);          //設定放大倍率1(地球)-21(街景)
        mapController.animateTo(station);   //指定地圖中央點
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }
}

ps. Google APIs還滿吃資源的,載入要有點耐心。如果發生任何不明錯誤,可以嘗試重開Eclipse或虛擬機器。

無法顯示地圖時(2011.09.12新增)

  1. 請確認開發時使用debug.keystore產生MD5
  2. 若是在產生MD5時變成SHA1,可加入-v參數(網友Brian提供,參考網頁)
  3. MD5要加入res/layout/main.xml
  4. 開啟網路及存取權限
  5. 確認GeoPoint是(緯度,經度)