Android Google Map API 開發入門教程
開發基于谷歌地圖的應用和普通的android應用差不多都要使用它提供給我們的類庫,所不同的是google map的類庫不是android平臺的基本類庫,是google api的一部分,所以建立項目時,SDK要選擇Google APIs;
還有一點,開發基于地圖的應用時候需要使用google map的APIkey,必須先申請key,然后才能開發基于地圖的應用。
下邊分步驟記錄下,整個過程:
一、申請google Maps API key(用于開發和debug)
為了能順利的申請Android Map API Key,必須要準備google的賬號和系統的證明書。一般Google發布Key都需要Google賬號,Google賬號是通用的,Gmail的賬號就可以。當一個程序發布時必須要證明書,證明書其實就是MD5.我們這里并不是發布,而只是為了開發測試,可以使用Debug版的證明書,下面我們就來學習如何申請Debug版的Key:
1.找到你的debug.keystore文件
在Eclipse工具下,選擇windows-->Preference-->Android-->Build, 其中Default debug keystore的值便是debug.keystore的路徑了。
2.取得debug.keystore的MD5值
首先cmd命令行進入debug.keystore文件所在的路徑,執行命令:keytool -list -keystore debug.keystore ,這時可能會提示你輸入密碼,這里默認的密碼是“android",這樣即可取得MD5值。
3.申請Android Map 的API Key.
打開瀏覽器,輸入網址:http://code.google.com/android/maps-api-signup.html ,填入你的認證指紋(MD5)即可獲得apiKey了,結果顯示如下:
感謝您注冊 Android 地圖 API 密鑰!
您的密鑰是:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
我IE打開的時候是亂碼,不知道是不是自己電腦有問題。后來改用了chrome就正常顯示了。
到此,我們就完成了API Key的申請了,記錄下Key值,在后續開發中使用。(放在layout中加入的MapView中)
二.Google Map API的使用
Android中定義了一個名為com.google.android.map的包,其中包含了一系列用于在google map上顯示、控制和疊層信息的功能類,以下是該包中最重要的幾個類:
1.MapActivity: 這個類是用于顯示Google Map的Activity類,它需要連接底層網絡。MapActivity是一個抽象類,任何想要顯示MapView的activity都需要派生自 MapActivity,并且在其派生類的onCreate()中,都要創建一個MapView實例。
2.MapView: MapView是用于顯示地圖的View組件。它派生自 android.view.ViewGroup。它必須和MapActivity配合使用,而且只能被MapActivity創建,這是因為 MapView需要通過后臺的線程來連接網絡或者文件系統,而這些線程需要有MapActivity來管理。
3.MapController: MapController用于控制地圖的移動、縮放等。
4.OverLay: 這是一個可顯示于地圖之上的可繪制的對象。
5.GeoPoint: 這是一個包含經緯度位置的對象。
三.實例開發
1.創建工程,注意SDK旋轉為"Goolge APIs”
2.修改AndroidManifest.xml文件
由于使用Google Map API,所以必須添加<uses-library android:name="com.google.android.maps" />
由于需要從網絡獲取地圖數據,所以需要訪問網絡的權限<uses-permission android:name="android.permission.INTERNET"/>
可能還需要添加其他權限。
例如:
AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yarin.android.Examples_09_03" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses-library android:name="com.google.android.maps" /> <activity android:name=".Activity01" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-permission android:name="android.permission.INTERNET" /> <uses-sdk android:minSdkVersion="5" /> </manifest>
3.創建MapView
要顯示地圖,需要創建一個MapView,在Xml文件中的布局如下。其中的android:apiKey的值就是我們第一步申請的Key了。
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <com.google.android.maps.MapView android:id="@+id/MapView01" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="0AubmfALdupLSlQkE67OTXgcQgWtyhXcO7uhsIQ"/> </RelativeLayout>
當然,可以在程序中通過如下代碼來創建MapView:
MapView map = new MapView( this, "(android maps api key)");
4.實現MapActivity
MapView需要由MapActivity來管理,所以程序部分應該繼承自MapActivity類,必須實現isRouteDisplay方法。
MapView提供了3中模式的地圖,分別可以通過以下方式設置采用什么模式來顯示地圖。
mMapView.setTraffic(true); //設置為交通模式
mMapView.setSatellite(true); //設置為衛星模式//
mMapView.setStreetView(false); //設置為街景模式
通過setBuiltZoomControls方法設置地圖是否支持縮放。
5.MapController的使用
如果需要設置地圖顯示的地點以及放大倍數等,就需要使用MapController來控制地圖。可以通過如下代碼獲得MapController對象:
mMapController = mMapView.getController();
要定位地點,需要構造一個GeoPoint來表示地點的經緯度,然后使用animateTo方法將地圖定位到指定的GeoPoint上,代碼如下:
//設置起點為成都 mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000)); //定位到成都 mMapController.animateTo(mGeoPoint);
6.Ovelay的使用
如果需要在地圖上標注一些圖標文字等信息,就需要使用Overlay。這里我們首先要將地圖上的經度和緯度轉換成屏幕上的實際坐標,才能將信息繪制上去。Map API中提供了Projection.toPixels(GeoPoint in,GeoPoint out)方法,可以將經度和緯度轉換成屏幕上的坐標。
首先需要實現OverLay中的draw方法才能在地圖上繪制信息,代碼如下:
class MyLocationOverlay extends Overlay { @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { ........ } }
綜合上面的代碼如下:
Activity01.java import java.util.List; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.os.Bundle; 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 com.google.android.maps.Overlay; public class Activity01 extends MapActivity { private MapView mMapView; private MapController mMapController; private GeoPoint mGeoPoint; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mMapView = (MapView) findViewById(R.id.MapView01); //設置為交通模式 // mMapView.setTraffic(true); //設置為衛星模式 // mMapView.setSatellite(true); //設置為街景模式 mMapView.setStreetView(false); //取得MapController對象(控制MapView) mMapController = mMapView.getController(); mMapView.setEnabled(true); mMapView.setClickable(true); //設置地圖支持縮放 mMapView.setBuiltInZoomControls(true); //設置起點為成都 mGeoPoint = new GeoPoint((int) (30.659259 * 1000000), (int) (104.065762 * 1000000)); //定位到成都 mMapController.animateTo(mGeoPoint); //設置倍數(1-21) mMapController.setZoom(15); //添加Overlay,用于顯示標注信息 MyLocationOverlay myLocationOverlay = new MyLocationOverlay(); List<Overlay> list = mMapView.getOverlays(); list.add(myLocationOverlay); } protected boolean isRouteDisplayed() { return false; } class MyLocationOverlay extends Overlay { @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { super.draw(canvas, mapView, shadow); Paint paint = new Paint(); Point myScreenCoords = new Point(); // 將經緯度轉換成實際屏幕坐標 mapView.getProjection().toPixels(mGeoPoint, myScreenCoords); paint.setStrokeWidth(1); paint.setARGB(255, 255, 0, 0); paint.setStyle(Paint.Style.STROKE); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.home); canvas.drawBitmap(bmp, myScreenCoords.x, myScreenCoords.y, paint); canvas.drawText("天府廣場", myScreenCoords.x, myScreenCoords.y, paint); return true; } } }
轉載地址:http://www.cnblogs.com/playing/archive/2011/04/23/2025419.html