天天看點

google地圖密鑰申請與将google地圖內建到自己的程式中(附源代碼)

開發google地圖,很重要的一個類就是MpaView,MapView類是一個讓你的應用可以和Google Maps融合到一起的類,就是說通過MapView你可以讓你的應用來下載下傳、顯示、标記和控制Google Maps。但為了得到地圖資料,你就必須進行注冊來得到一個Maps API key(即google地圖API密鑰)。當然在程式開發和測試階段,這個Maps API key還隻是臨時的,它現在和SDK debug certificate唯一綁定,當你的應用要釋出的時候,你必須根據你的要釋出的certificate來注冊一個新的Maps API Key,這個先不管。我們來看怎樣得到一個臨時的,即在開發和調試的時候使用的根據debug certificate得到的Maps API Key。

要注冊得到Maps API key,步驟如下先得到debug keystone的位置,然後根據這個debug keystone檔案再得到MD5指紋,最後就是再根據這個MD5指紋得到google地圖API密鑰。

首先就是得到debug keystore的位置,預設情況下,這個debug keystore是你建立的AVD在同一個目錄下的,比如Windows 7系統和 Vista系統:C:\Users\<user>\.android\debug.keystore,OS X 和Linux系統下是:~/.android/debug.keystore。當然這種檢視方式很麻煩,簡便的是,如果你是用Eclipse+ADT進行android開發的話,你可以通過這樣的方式來得到debug keystore的位置:在Eclipse中點Windows>Preferences>Android>Build,在右側視窗中你就可以看到,有Default debug kystore

标題後面就是,比如我的是C:\Users\lx\.android\debug.keystore,複制下來,然後在dos指令行中輸入:

keytool -list -alias androiddebugkey -keystore "C:\Users\lx\.android\debug.keystore" -storepass android -keypass android -v      

其中keystool是jdk安裝目錄的jre/bin目錄下的一個指令,如果你沒有配置環境變量的話,需要先轉到jre/bin目錄再執行上面的内容,這樣就會得到一個MD5 fingerprint,是類似于這樣的:

MD5: 97:91:D9:36:C9:99:F1:16:CD:9B:5D:B3:F8:49:37:3E      

然後将這個MD5指紋,複制下來,打開這個連結:

http://code.google.com/intl/zh-CN/android/maps-api-signup.html

,把剛才的MD5指紋輸入到指定位置,并在前面打上對号,然後點Generate API Key,就會得到我們費了這半天的勁想要得到的Google地圖API密鑰了,這個Maps API key是類似于這樣的一串代碼:

0a5PgXEMxha3KPIzWyUsr5AUCEueqpcEIPDm8Zg      

注意,在上面得到MD5指紋的時候,輸入的指令中最後有個-v,而按google教程上的說明,沒有加-v,結果得到了證書指紋 (SHA1),而沒有得到我們要的MD5,這樣在申請Maps API key的是後它會提示“您輸入的指紋無效”。還有一點就是這個申請過程需要你有google賬号,沒有的話可以申請一個,很友善。

關于這部分的官方教程可以參看:

http://code.google.com/intl/zh-CN/android/add-ons/google-apis/mapkey.html

有了這個google地圖API密鑰,就來讓我們正是開發我們的地圖應用。

首先,建立一個Android項目,名為HelloGoogleMaps。因為要用到Maps庫,而這個庫又不是标準的android庫,是以需要在AndroidManifest.xml檔案中的<application>标簽下加入以下代碼:

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

因為要從網際網路那裡獲得位置資料,是以還要再AndroidManifest.xml檔案中加入通路Internet的權限:

<uses-permission android:name="android.permission.INTERNET" />      

然後就是,要顯示地圖,就要有一個MapView控件了。在布局檔案main.xml檔案中加入以下代碼:

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

其中apiKey就是我們前面申請的Google地圖密鑰,clickable屬性為true表示使用者可以與地圖進行互動。

然後打開HelloGoogleMaps.java這個檔案,将繼承自Activity的HelloGoogleMaps類,改為繼承自MapActivity,MapActivity是Maps庫中的Activity的一個子類。并重寫一個叫isRouteDisplayed()的方法,這個方法是用來顯示路徑資訊的,這裡我們沒有這方面的需求,讓其傳回false:

@Override
protected boolean isRouteDisplayed() {
   	   return false;
}      

這個關于Google地圖的小項目寫到這裡,就已經可以實作地圖的顯示,并且可以在這個地圖上來回拖動了,不過還沒有我們常見的地圖的縮放功能,這需要在HelloGoogleMaps的oncreate()方法中填入以下代碼:

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

這時候運作這個程式,你的程式就可以顯示Google地圖,并能夠來回平移和進行地圖縮放了。

當然你如果想标記你感興趣的位置的話,請繼續往下看:

首先建立一個名為HelloItemizedOverlay的類,需要實作ItemizedOverlay這個接口。

然後定義一個ArrayList,用來存放OverlayItem對象(該對象中主要用來存放地理位置等資訊):

private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();      

注意在添加完新的OverLayItem對象之後,還要調用populate()方法,隻有這樣的話,我們寫的HelloItemizedOverlay類的對象才能正确讀取ArrayList中的OverlayItems對象,并準備繪制它們。

然後就是設定用來标記感興趣點的圖示,這個圖示将用來作為ArrayList<OverLayItem>對象中所儲存的所有的OverLayItem對象的圖示。設定這個圖示是在HelloItemizedOverlay的構造器中實作的,是以在HelloItemizedeOverLay類中,重寫一個這樣的構造器:

public HelloItemizedOverlay(Drawable defaultMarker) {
  	 super(boundCenterBottom(defaultMarker));
}      

其中boundCenterBottom()方法表示将使圖檔的中心用來标記感興趣的點。

還有就是,在HelloItemizedOverLay類中還需要重寫size()方法,用來傳回ArrayList<OverlayItem>中的對象數。

另外再重寫HelloItemizedOverlay的構造方法:

public HelloItemizedOverlay(Drawable defaultMarker, Context context) {
 	 super(boundCenterBottom(defaultMarker));
  	 mContext = context;
}      

還要重寫onTap()方法,用來當你點選标記圖示的時候彈出一個對話框,顯示一些從OverlayItem對象那得到的資訊:

@Override
protected boolean onTap(int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
 	 dialog.setTitle(item.getTitle());
 	  dialog.setMessage(item.getSnippet());
 	  dialog.show();
return true;
}      

然後傳回到前面繼承自MapView的HelloGoogleMasActivity對象,在這裡将建立HelloItemizedOverlay類的對象,獲得标記圖檔,和向HelloItemizedOverlay對象的成員變量ArrayList<OverlayItem>的對象中添加OverLayItem對象,其中這個添加到OverLayItem對象中包含了要标記點的地理位置和其他一些文本資訊。

Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker);      
//建立HelloItemizedOverlay對象
HelloItemizedOverlay itemizedoverlay = new HelloItemizedOverlay(drawable, this);              
//設定經緯度這裡設的是青島的經緯度。(前面的是緯度乘以1000000,後面是經度乘以1000000)
GeoPoint point = new GeoPoint(36040000,120200000);
//建立OverLayItem對象,裡面包含經緯度等資訊
OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "I'm in Mexico City!");
//将建立的OverLayItem對象添加到HelloItemizedOverlay類中的ArrayList<OverlayItem>對象中
itemizedoverlay.addOverlay(overlayitem);
//在地圖上顯示标記
mapOverlays.add(itemizedoverlay);      

最後一步就是将,我們要顯示的标記标記在指定位置。

然後運作程式,就會得到一張顯示的地圖,和我們标記在某點的一個圖示。

google地圖密鑰申請與将google地圖內建到自己的程式中(附源代碼)

本文可以參考官方API:

http://developer.android.com/resources/tutorials/views/hello-mapview.html

當然,你還可以在此基礎上繼續使用LocationListener來時時更新地圖資訊,這裡就不再繼續了。

最後附上源碼:

http://download.csdn.net/detail/yaolingrui/4140501