Android開發筆記-使用Google地圖

內容說明:建立私人金鑰、取得金鑰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檔案),找到<longitude>標籤裡的值表示經度,<latitude>標籤裡的值則表示緯度。

取得金鑰的認證指紋(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,加上<uses-library...>聲明使用Google地圖的函式庫,並且在</application>後面加入<uses-permission...>開啟網際網路使用權限:

8
9
10
11
12
13
    <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的<LinearLayout...>下加入<com.google.android.maps.MapView... />標籤,並且設定apiKey為前面取得的Google Maps API Key。clickable是指使用者能不能拖移地圖(物件方法請參考官方網站):

7
8
9
10
11
12
<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,並且根據系統指示產生相對應的程式碼。原始的空白框架如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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(請參考安裝開發環境)。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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是(緯度,經度)
Share on Google+
You can follow any responses to this entry through the RSS 2.0 feed.You can leave a response, or trackback from your own site.
40 Responses
  1. Mark says:

    不會的,我那些步驟都有照著做,
    最後發現問題是公司網路會擋GMap的權限,
    因此顯圖都是方格子,
    找了很久才發現問題是這樣,
    (公司網路直接開googlemap是可以的)
    也順便給有這個問題的人參考一下摟

  2. Aeria says:

    抱歉,打擾了

    想請問一下因為最近v2改v3的關係

    原先用來申請API key的網頁已經消失了

    經過多次的google結果...

    只知道可以從這裡↓用MD5的編碼來獲取v2的API key
    https://code.google.com/apis/console/#project:189351846451:access

    但是我從這邊取得的apiKey放入main.xml中一樣沒辦法顯示地圖...是否是我申請KEY的方法或流程有錯誤呢? 不知大大是否在這方面有所研究...

    • Davina says:

      謝謝你提供這項資訊
      但因為我還沒有執行過~所以現在無法告訴你答案
      我查了一下官方的說明,也許你可以研究看看
      因為我不確定什麼時間能更新這個部份
      不好意思^^"

  3. Aeria says:

    抱歉,再打擾一下 >"<

    最近測試了一下,發現v2的寫法似乎失去定為自己的功能了

    包含網路上的幾個範例,還有工具書上的範例,以及自己半年前寫的一個簡單的程式,都不能定位自己的位置了

    不知道大大您的這隻程式能否定位自己呢??

    可否請您抽空幫忙測試一下呢

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *


× 4 = 四

你可以使用這些 HTML 標籤與屬性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>