android 百度地圖應用

     最近用到百度地圖API,在這裏跟大家分享一下經驗。要使用百度API和google一樣先要去百度地圖API網站上去申請KEY,申請地址如下:http://dev.baidu.com/wiki/static/imap/key/ ,申請完畢以後就可以是用了,但是百度API是作爲第三方插件的方式加入到項目中所以,你還需要下載百度地圖API的jar包,下載地址如下:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%9B%B8%E5%85%B3%E4%B8%8B%E8%BD%BD

     然後打開下載包可以發現裏面有一個jar包和一個.so文件,需要把這兩個文件拷貝到項目根目錄下面的libs文件夾下,並且還要新建一個armeabi文件夾,因爲.so文件需要放在這個文件夾下面,具體步驟可以參考《百度手機地圖sdk使用簡要說明》,最後需要在Manifest文件中添加權限和版本支持如下:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <!--版本支持-->
    <supports-screens
        android:anyDensity="true"
        android:largeScreens="true"
        android:normalScreens="true"
        android:resizeable="true"
        android:smallScreens="true" />

    <uses-sdk android:minSdkVersion="3" />

     到這裏已經完事具備,大家可以在佈局文件中加入Mapview了,代碼如下:

    <com.baidu.mapapi.MapView
        android:id="@+id/mv_locate_map"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

     然後寫一個類繼承MapActivity把佈局文件設置進去就可以在地圖上顯示了,如下:

    

    現在來講講百度API主要的幾個類的使用,首先我們需要得到一個BMapManager對象的實例,剛剛大家看到我們的佈局文件並沒有加入key的地方,其實百度地圖的key是在程序中添加的代碼如下:

                           
                           manager = new BMapManager(context);
			manager.init(“API-KEY 放在這裏”, new MKGeneralListener() {

				@Override
				public void onGetPermissionState(int error) {
					if (error == MKEvent.ERROR_PERMISSION_DENIED) {
						// 權限錯誤
					}
				}

				@Override
				public void onGetNetworkState(int error) {
					// 網絡錯誤
				}
			});
			manager.start();
			locationManager = manager.getLocationManager();

得到了BMapManager對象以後我們就可以得到LocationManager對象,這個對象大家應該都很清楚,通過它可以得到當前位置信息,還可以通過它添加位置監聽器。這裏和google地圖不同的是,當在添加位置監聽器的時候並沒有一起設置監聽器的觸發時間間隔,如果需要必須通過MKLocationManager的setNoitifyInternal(maxTime,minTime)方法添加,第一個參數的通知的最大時間間隔,第二個則是最小時間間隔。註冊監聽器這是調用MKLocationManager的requestLocationUpdates(listener); 方法,通過這些方法的設置我們就可以定時得到當前的位置信息了。

       然後下面應該把當前位置展示在地圖上並加上標記,實現這些功能就需要MapView對象了,當然得到MapView對象很簡單,大家應該都明白就不多說了。得到mapView對象以後需要設置幾個常用的參數代碼如下:

                  mapView.setBuiltInZoomControls(true);
	      mapView.setDrawOverlayWhenZooming(true);

第一個是在地圖上面加上縮放按鈕,第二個設置是在縮放的時候重繪地圖標記。然後需要控制地圖我們需要得到MapController對象代碼如下:

                  control = this.mapView.getController();
               control.setZoom(zoomLeve);

這樣就得到了地圖控制器,第二個是設置地圖的默認縮放等級,參數在0-18之間的整形參數。我這裏是設置的最大縮放級別。然而在地圖上加標記需要通過Overlay和ItemizedOverlay對象來實現,當然百度地圖API提供了幾個內置的對象給我們使用,這裏我使用的是MyLocationOverlay對象代碼如下:

                 MyLocationOverlay overlay = new MyLocationOverlay(context, mapView);
               mapView.getOverlays().add(overlay)

MyLocationOverlay 初始化的時候需要兩個參數一個就是上下文對象,一個就是地圖對象,這樣就可以得到一個標記當前位置的圖標,然後把這個圖標加入到地圖中就可以了。效果如上圖所示。然後再位置監聽器裏面加上更新地圖的代碼就可以了,代碼如下:

         @Override
         public void onLocationChanged(Location location) {
		if (location != null) {
	            GeoPoint point = new GeoPoint((int) (latitude * 1E6),
				(int) (longitude * 1E6));
		   //mv_locate_map.getOverlays().clear(); //清除所有標記
		   manager.addOverlay(overlay); //添加標記
		   manager.getControl().animateTo(point); //把地圖移動到當前點上
		   mv_locate_map.invalidate(); //重繪地圖		
                  }
	}

我這裏之所以要清除所有標記應該前面我添加了每隔幾秒鐘就會更新地圖標記,不然地圖上的標記會越來越多,到後面對性能有影響,這個也是根據程序邏輯來的,大家可以不用每次清除也可以。百度地圖API還提供了很多地圖標記和查詢功能,大家可以參考《百度地圖API文檔》裏面有詳細介紹。

        下面來講講我在使用中遇到的種種問題以及我的解決辦法吧,首先說說我遇到的問題。

         其實這個問題主要是產生於我要添加多個位置監聽器,而且每個監聽器的做得事不同,而且每個監聽器關閉的時間也不同,這是就出現一個問題,比如我現在同事添加了三個監聽器,但是我只要調用removeUpdates(listener);方法就會把所有監聽器移除。這個問題糾結我幾天,最後我想出的辦法就是在添加監聽器的時候同時把監聽器放到一個Map<String, LocationListener> 中給每個監聽器命一個名字,然後在需要移除的時候根據這個名字把這個監聽器對象從map中取出來再移除就行了。至於爲什麼會出現這種情況我也不明白,可能是一個BUG吧。

        還有一個還有一個需要注意的是BMapManager對象初始化完成以後必須調用manager.start();方法才能正常展示地圖,不然地圖不會顯示,與之對應的當然有個manager.stop();方法,這個stop方法千萬不能亂用,如果你沒有完全脫離是用百度API的話最好別調用,不然所有地圖中的監聽器都會失效。

       還有一個地方也需要調用start()方法就是在onResume()方法中,代碼如下:

     

         @Override
	protected void onResume() {
		if (manager != null) {
		   manager.onStartMap();
		}  super.onResume();
	}

    如果大家覺得我哪裏說得不對的請指教,多多交流···呵呵



發佈了34 篇原創文章 · 獲贊 47 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章