開發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);
最後一步就是将,我們要顯示的标記标記在指定位置。
然後運作程式,就會得到一張顯示的地圖,和我們标記在某點的一個圖示。
本文可以參考官方API:
http://developer.android.com/resources/tutorials/views/hello-mapview.html當然,你還可以在此基礎上繼續使用LocationListener來時時更新地圖資訊,這裡就不再繼續了。
最後附上源碼:
http://download.csdn.net/detail/yaolingrui/4140501