天天看點

Android google map

最近在做一個項目,其中就需要用到咱們今天要說的主角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的哦!!!