最近在做一個項目,其中就需要用到咱們今天要說的主角Google Map。開始做的時候感覺沒多難的,可是慢慢的慢慢的就發現問題越來越多了,當然本人水準有限是其中之一,也有一些讓不少人蛋疼的問題。廢話不多說,一步步來看看咱們可能回碰到的問題吧! 如果你要做一個google Map的項目,首先你用的sdk 應該是對應版本的google api ,這個不多說了,大家應該都知道的。然後你需要注冊google賬号(當然如果你已經有了的話就不用了),然後用你的MD5去https://developers.google.com/android/maps-api-signup?hl=zh-CN申請apikey。至于MD5怎麼得到,這個大家可以去網上搜搜,很多的。這裡就出現了大家可能會碰到的第一個蛋疼的問題,剛剛那個申請的網址打開後可能申請不了。是以,翻牆吧。好了,準備工作做完了,現在就正式開始了!!!!
首先,需要有必須的權限,比如:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET" />
在manifest.xml中加上要用的maps庫:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.package.name">
...
<application android:name="MyApplication" >
<uses-library android:name="com.google.android.maps" />
...
</application>
...
</manifest>
這裡又隐形的出現了另外一個問題,那就是com.google.android.maps.jar 這個檔案可能在你的真機上不存在(如果你用真機測試的話),模拟機上是存在的,真機不存在是有可能的,這是因為很多廠商沒有開通這個。解決真機檔案不存在的問題步驟如下:
1、首先進入到你的adb.exe安裝目錄下,然後執行指令adb -d shell;進入shell模式:$
2、打開模拟器的DDMS視圖,将/system/framework 的com.google.android.maps.jar , com.google.android.gtalkservice.jar檔案以及/system/etc下面的com.google.android.maps.xml , com.google.android.gtalkservice.xml檔案導出(android 2.2以上系統裡沒有 com.google.android.gtalkservice.jar 和 com.google.android.gtalkservice.xml檔案,是以隻需導前一個)。
檔案導出既可以直接在DDMS中導出,也可以用指令導出,如:
adb pull /system/framework/com.google.android.maps.jar d:/yourdir/com.google.android.maps.jar;
adb pull /system/framework/com.google.android.gtalkservice.jar d:/yourdir/com.google.android.gtalkservice.jar;
adb pull /system/framework/com.google.android.maps.xml d:/yourdir/com.google.android.maps.xml;
adb pull /system/framework/com.google.android.gtalkservice.xml d:/yourdir/com.google.android.gtalkservice.xml;
3、将這些檔案導入你的真機系統裡:
adb push d:/yourdir/com.google.android.maps.jar /syetem/framework;
adb push d:/yourdir/com.google.android.gtalkservice.jar /syetem/framework;
adb push d:/yourdir/com.google.android.maps.xml /syetem/etc;
adb push d:/yourdir/com.google.android.gtalkservice.xml /syetem/etc;
現在你的真機裡就有了這些檔案了。當然上面步驟能成功的前提是獲得root權限!!!!!
現在來分析一下Maps 庫:
Maps庫提供了十幾個類,具體可以參考這裡http://code.google.com/intl/ja/android/add-ons/google-apis/reference/index.html,包括Mapview,MapController,MapActivity等。
(1)MapController
控制地圖移動,伸縮,以某個GPS坐标為中心,控制MapView中的view元件,管理Overlay,提供View的基本功能。使用多種地圖模式(地圖模式(某些城市可實時對交通狀況進行更新),衛星模式,街景模式)來檢視Google Map。
常用方法有:animateTo(GeoPoint point) setCenter(GeoPoint point) setZoom(int zoomLevel) 等
(2)MapView
Mapview是用來顯示地圖的view, 它派生自android.view.ViewGroup。當MapView獲得焦點,可以控制地圖的移動和縮放。地圖可以以不同的形式來顯示出來,如街景模式,衛星模式等,通過setSatellite(boolean) setTraffic(boolean), setStreetView(boolean) 方法。MapView隻能被MapActivity來建立,這是因為mapview需要通過背景的線程來連接配接網絡或者檔案系統,而這些線程要由mapActivity來管理。
需要特别說明的一點是,android 1.5中,map的zoom采用了built-in機制,可以通過setBuiltInZoomControls(boolean)來設定是否在地圖上顯示zoom控件。
(3)MapActivity
管理Activity的生命周期,為mapview建立及取消對map service的連接配接。
MapActivity是一個抽象類,任何想要顯示MapView的activity都需要派生自MapActivity。并且在其派生類的onCreate()中,都要建立一個MapView執行個體,可以通過MapViewconstructor (然後添加到View中ViewGroup.addView(View)) 或者通過layout XML來建立。
(4)Overlay
Overlay是覆寫到MapView的最上層,可以擴充其ondraw接口,自定義在MapView中顯示一些自己的東西。MapView通過MapView.getOverlays()對Overlay進行管理。除了Overlay這個基類,Google還擴充了2個比較有用的Overlay
1)MylocationOverlay—內建了Android.location中接收目前坐标的接口,內建SersorManager中CompassSensor的接口
我們隻需要enableMyLocation(),enableCompass就可以讓我們的程式擁有實時的MyLocation以及Compass 功能(Activity.onResume()中)。
2)ItemlizedOverlay—管理一個OverlayItem連結清單,用圖檔等資源在地圖上作風格相同的标記。
(5)Projection:MapView中GPS坐标與裝置坐标的轉換(GeoPoint和Point)。
其中主要的代碼如下:
xml檔案裡的MapView代碼
<com.google.android.maps.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:enabled="true"
android:clickable="true"
android:apiKey="???????????????????????????????????"
/>
Activity裡的主要代碼:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 擷取MapView
map=(MapView)findViewById(R.id.map);
// 設定顯示模式
map.setTraffic(true);
map.setSatellite(false);
map.setStreetView(true);
// 設定可以縮放
map.setBuiltInZoomControls(true);
// 設定初始地圖的中心位置
GeoPoint geoBeijing=new GeoPoint((int)(39.95*1000000), (int)(116.37*1000000));
mapCon=map.getController();
mapCon.setCenter(geoBeijing);
}
這裡的Activity是繼承了MapActivity的哦!!!