Android應用中使用百度地圖API並加入標註(一)

網上一些資料這樣的的內容已通過時了,這裏是最新的內容,假設哪裏不正確,請吐槽。。。
html

1)下載百度地圖移動版API(Android)開發包
      要在Android應用中使用百度地圖API,就需要在project中引用百度地圖API開發包,這個開發包包括兩個文件:java

下載地址:http://pan.baidu.com/s/1i31enrBandroid

2)申請API Keyapi

//包名網絡

格式:好比:B7:6C:CF:E2:47:50:9B:3E:34:F7:08:72:F3:AC:F1:BE:55:D3:77:FB;com.majianjie.baidumap
   申請地址:http://lbsyun.baidu.com/apiconsole/keyapp

3)建立一個Androidproject  文件夾結構例如如下:ide


4)在佈局文件里加入地圖控件(res/layout/activity_main.xml)
函數

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


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

</LinearLayout>

5)建立Activity

package com.majianjie.baidumap;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;
import com.example.baidumap.R;

public class MainActivity extends Activity {
	private Toast mToast;
	private BMapManager mBMapManager;
	public MapView mMapView = null;			//MapView 是地圖主控件
	private MapController mMapController = null;//用MapController完畢地圖控制
	MKMapViewListener mMapListener = null;     //MKMapViewListener 用於處理地圖事件回調
	// 顯示交通地圖
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		/**
		 * 使用地圖sdk前需先初始化BMapManager,這個必須在setContentView()先初始化
		 */
		mBMapManager = new BMapManager(this);
		
		//第一個參數是API key,   第二個參數是常常使用事件監聽,用來處理一般的網絡錯誤,受權驗證錯誤等,你也可以不加入這個回調接口
		mBMapManager.init("LDtH1sVwr7kygaF0aTqaVwWU", new MKGeneralListener() {
			
			//受權錯誤的時候調用的回調函數
			@Override
			public void onGetPermissionState(int iError) {
				if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
					showToast("API KEY錯誤, 請檢查!");
	            }
			}
			
			//一些網絡狀態的錯誤處理回調函數
			@Override
			public void onGetNetworkState(int iError) {
				if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
					Toast.makeText(getApplication(), "您的網絡出錯啦!", Toast.LENGTH_LONG).show();
	            }
			}
		});
		
		
		setContentView(R.layout.activity_main);
		
		mMapView = (MapView) findViewById(R.id.bmapView);
		
        
        mMapController = mMapView.getController();     // * 獲取地圖控制器
        mMapController.enableClick(true);                //*  設置地圖是否響應點擊事件  . 
        mMapController.setZoom(12);					// * 設置地圖縮放級別
        mMapView.setBuiltInZoomControls(true);      // * 顯示內置縮放控件
        mMapView.setSatellite(true);				//設置顯示爲衛星地圖:
        //mMapView.setBuiltInZoomControls(true);
        
        /** 
         *  在想要加入Overlay的地方使用下面代碼, 
         *  比方Activity的onCreate()中 
         */  
        //準備要加入的Overlay  
        double mLat1 = 39.904508;  
        double mLon1 = 119.53971899999999;  
       
        // 用給定的經緯度構造GeoPoint,單位是微度 (度 * 1E6)  
        GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  
        //準備overlay圖像數據,依據實情狀況修復  
        Drawable mark= getResources().getDrawable(R.drawable.set);  
        //用OverlayItem準備Overlay數據  
        OverlayItem item1 = new OverlayItem(p1,"item1","item1");  
        //使用setMarker()方法設置overlay圖片,假設不設置則使用構建ItemizedOverlay時的默認設置  
           
        //建立IteminizedOverlay  
        CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView);  
        //將IteminizedOverlay加入到MapView中  
          
        mMapView.getOverlays().clear();  
        mMapView.getOverlays().add(itemOverlay);  
           
        //現在所有準備工做已準備好,使用下面方法管理overlay.  
        //加入overlay, 當批量加入Overlay時使用addItem(List<OverlayItem>)效率更高  
        itemOverlay.addItem(item1);  
        mMapView.refresh(); 
        
         mMapController.setCenter(p1);						//設置p地方爲中心點
        mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
			
        	// * 地圖移動完畢時會回調此接口 方法
			@Override
			public void onMapMoveFinish() {
				showToast("地圖移動完畢!");
			}
			
			 //* 地圖載入完畢回調此接口方法
			@Override
			public void onMapLoadFinish() {
				showToast("地圖載入完畢!");
			}
			
			 //*  地圖完畢帶動畫的操做(如: animationTo())後,此回調被觸發
			@Override
			public void onMapAnimationFinish() {
				
			}
			
			 //當調用過 mMapView.getCurrentMap()後,此回調會被觸發  可在此保存截圖至存儲設備
			@Override
			public void onGetCurrentMap(Bitmap arg0) {
				
			}
			
			 //* 點擊地圖上被標記的點回調此方法
			@Override
			public void onClickMapPoi(MapPoi arg0) {
				if (arg0 != null){
					showToast(arg0.strText);
				}
			}
		});
	}


	
	@Override
	protected void onResume() {
    	//MapView的生命週期與Activity同步,當activity掛起時需調用MapView.onPause()
		mMapView.onResume();
		super.onResume();
	}



	@Override
	protected void onPause() {
		//MapView的生命週期與Activity同步,當activity掛起時需調用MapView.onPause()
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onDestroy() {
		//MapView的生命週期與Activity同步,當activity銷燬時需調用MapView.destroy()
		mMapView.destroy();
		
		//退出應用調用BMapManager的destroy()方法
		if(mBMapManager != null){
			mBMapManager.destroy();
			mBMapManager = null;
		}
		
		super.onDestroy();
	}

	
	
     //* 顯示Toast消息 
    private void showToast(String msg){  
        if(mToast == null){  
            mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);  
        }else{  
            mToast.setText(msg);  
            mToast.setDuration(Toast.LENGTH_SHORT);
        }  
        mToast.show();  
    } 
	
	
}

6)在AndroidManifest.xml中配置  加入權限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    
  <uses-permission android:name="android.permission.INTERNET" />    
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    
  <uses-permission android:name="android.permission.READ_PHONE_STATE" />  

7)另外一個文件是本身定義的,繼承自: ItemizedOverlay(百度地圖中的,不是Android本身的)

Overlay簡單介紹
      Overlay一般被譯爲「圖層」或「覆蓋物」。那麼對於地圖而言,什麼稱之爲覆蓋物?「所有疊加或覆蓋到地圖之上的內容,都被稱之爲地圖覆蓋物,如標註、矢量圖形元素(包含:折線和多邊形和圓)、定位圖標等。覆蓋物擁有本身的地理座標,當您拖動或縮放地圖時,它們會對應的移動。
      爲了讓你們能夠對Overlay有更進一步的認識,咱們再經過如下的圖形來直觀的認識它。 圖中標記的那些紅色的圖標A,B,...,J正是Overlay的當中一種形式。假設你瞭解PhotoShop中圖層的概念,這裏應該不難理解。咱們能夠這樣來理解地圖、圖層與圖層上標記物三者的關係: 下圖中的那些紅色標記並不屬於地圖的一部分,這些所有的標記是附着在圖層上的,而後將圖層蒙在地圖之上。
佈局

百度地圖API提供的幾種Overlay
      百度地圖API提供了下面幾種Overlay(覆蓋物): 
      1)Overlay:它是所有覆蓋物的抽象基類,所有的覆蓋物均繼承此類的方法,實現用戶本身定義圖層顯示;
      2)MyLocationOverlay:一個負責顯示用戶當前位置的Overlay; 
      3)ItemizedOverlay:它包括了一個OverlayItem列表,至關於一組分條的Overlay,經過繼承此類,將一組興趣點顯示在地圖上;
      4)PoiOverlay:本地搜索圖層,提供某一特定地區的位置搜索服務,比方在北京市搜索「公園」,經過此圖層將公園顯示在地圖上; 
      5)RouteOverlay:步行、駕車導航線路圖層,將步行、駕車出行方案的路線及關鍵點顯示在地圖上;
      6)TransitOverlay:公交換乘線路圖層,將某一特定地區的公交出行方案的路線及換乘位置顯示在地圖上。
動畫


如下的文件是:CustomItemizedOverlay.java    網上有些內容是比較早的,百度地圖API已經放棄使用了,這裏是最新的,具體:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3

package com.majianjie.baidumap;

import android.graphics.drawable.Drawable;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {  
    //用MapView構造ItemizedOverlay  
    public CustomItemizedOverlay(Drawable mark,MapView mapView){  
            super(mark,mapView);  
    }  
    protected boolean onTap(int index) {  
        //在此處理item點擊事件  
        System.out.println("item onTap: "+index);  
        return true;  
    }  
        public boolean onTap(GeoPoint pt, MapView mapView){  
                //在此處理MapView的點擊事件,當返回 true時  
                super.onTap(pt,mapView);  
                return false;  
        }  
}          


執行圖:

基本就這些,百度地圖API中的內容很是豐富,以後會陸續加入,請繼續關注!謝謝!假設哪裏不正確,請吐槽。。。

相關文章
相關標籤/搜索