初探 Android 百度地圖SDK版本v2.0.0
一、開發前的準備工作:
1、注冊百度賬號,并登錄。(有百度賬號的話直接登錄)
2、申請Key,地址:http://developer.baidu.com/map/android-mobile-apply-key.htm
注:經研究發現在申請KEY時,應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)這樣,生成的API密鑰后面才可用。其他格式的也可以生成API密鑰,但是在使用過程中會出問題。(比如:一開始就報授權Key錯誤,或者使用一段時間后就不行了)
3、下載SDK(v2.0.0),地址:http://developer.baidu.com/map/sdkandev-download.htm
注:下載Android SDKv2.0.0 (矢量地圖版),里面有BaiduMap_AndroidSDK_v2.0.0_Lib.zip、BaiduMap_AndroidSDK_v2.0.0_Docs.zip和BaiduMap_AndroidSDK_v2.0.0_Sample.zip三個壓縮包。
二、搭建開發環境,開始The world, hello(世界,你好)之旅:
1、創建android項目,在選SDK時(Choose an SDK to target),選的不是Google APIs,是不帶地圖服務的SDK 。
2、在項目創建完畢,在工程里新建libs文件夾,將開發包(BaiduMap_AndroidSDK_v2.0.0_Lib.zip)里的baidumapapi_v2_0_0.jar拷貝到libs根目錄下,將libBMapApiEngine_v2_0_0.so和libvi_voslib.so 拷貝到libs\armeabi目錄下,拷貝完成后的工程目錄如下圖所示:

3、在AndroidManifest.xml文件中添加使用權限:
<!-- 使用網絡功能所需權限 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<!-- 讀取手機的當前狀態權限,沒有的話會報錯,這個是使用百度地圖API必須的 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<!--Cache功能需要讀寫外部存儲器 ,若沒這個權限,地圖加載不出來-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission></pre> <p><br />
4、添加對多種屏幕的支持:</p>
<!--
添加屏幕支持
android:anyDensity="true"
這個屬性指明應用程序是否包含了能夠適用于任何屏幕密度的資源。
對于支持Android1.6(API Level 4)和更高版本的應用程序,這個屬性的默認值是true,
并且除非絕對的確認這是應用程序正常工作所必須的,否則不應該把它設置為false。
只是在應用程序直接操作位圖時才需要禁止這個屬性。
android:largeScreens="true"
這個屬性用于指示應用程序是否支持較大外形的屏幕。
一個large類型的屏幕被定義成一個比normal類型的手持設備的屏幕明顯還要大的屏幕,
并且為了讓應用程序能夠良好的使用,使用這個屬性時要特別小心,盡管可以依賴系統來調整尺寸,
以便能夠填充屏幕。
這個屬性的默認值實際上在某些版本之間是不同的,因此最好在任何時候都明確的聲明這個屬性。
如果設置為false,系統會啟用屏幕兼容模式,這時要格外的小心。
android:normalScreens="true"
這個屬性用于指示應用程序是否支持普通外形的屏幕。
典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被認為是普通屏幕。
這個屬性的默認值是true。
android:smallScreens="true"
這個屬性用于指定應用程序是否支持較小外形的屏幕。
一個small類型的屏幕被定義成一個比normal(傳統的HVGA)類型的屏幕還要小的屏幕。
外部服務(如Google Play)不會把不支持小屏的應用程序提供給小屏設備,
因為很少有能夠確保該應用程序在小屏幕的設備上正常工作的平臺。這個屬性的默認值是true。
android:resizeable="true"
這個屬性用于指示針對不同的屏幕尺寸,應用程序是否可以調整尺寸。默認值是true。
-->
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" /></pre> <p><br />
5、配置Activity:</p>
<activity
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name"
android:name=".BaiduMapBaseActivity"
android:screenOrientation="sensor" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity></pre> <p> <span style="font-size:14px;"> 6、在布局xml文件中添加地圖控件:<br />
</span></p>
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
7、 創建地圖Activity,并import相關類:
a. 創建地圖引擎管理類對象,并初始化。
// 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯
mBMapManager = new BMapManager(this.getApplicationContext());
mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {
@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
"您的網絡出錯啦!", Toast.LENGTH_LONG).show();
}
}
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
// 授權Key錯誤:
Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),
"請在 DemoApplication.java文件輸入正確的授權Key!", Toast.LENGTH_LONG).show();
}
}
});</pre> <p><br />
b.通過ID獲取代表地圖顯示組件的MapView對象,并設置啟用內置的縮放控件。</p>
mMapView = (MapView) this.findViewById(R.id.bmapsView);
// 設置啟用內置的縮放控件
mMapView.setBuiltInZoomControls(true); c.獲取地圖控制器對象,并設置地圖的中心點及縮放級別。
// 獲取地圖控制器,可以用它控制平移和縮放
MapController mMapController = mMapView.getController();
// 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
// 北京天安門的經緯度:39.915 * 1E6,116.404 * 1E6
// GeoPoint mGeoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));
// 上海市浦東新區的GPS緯度經度值:31.224078,121.540419
GeoPoint mGeoPoint = new GeoPoint(
(int) (31.224078 * 1E6),
(int) (121.540419 * 1E6));
// 設置地圖的中心點
mMapController.setCenter(mGeoPoint);
// 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。
mMapController.setZoom(13);</pre> <p> <span style="font-size:14px;">d.重寫Activity的生命周期回調方法onResume()、onPause()和onDestroy(),管理<span style="font-size:14px;">地圖引擎管理類對象和顯示對象生命周期。</span></span></p>
@Override
protected void onResume() {
mMapView.onResume();
if (mBMapManager != null) {
mBMapManager.start();
}
super.onResume();
}
@Override
protected void onPause() {
mMapView.onPause();
if (mBMapManager != null) {
mBMapManager.stop();
}
super.onPause();
}
@Override
protected void onDestroy() {
mMapView.destroy();
if (mBMapManager != null) {
mBMapManager.destroy();
mBMapManager = null;
}
super.onDestroy();
}</pre> <p><span style="font-size:14px;">經過以上這些步驟,加載的是上海市浦東新區地圖(基礎圖),運行工程效果圖如下:</span></p>
注:基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。

e.在地圖中顯示實時交通信息示圖(當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。)
// 在地圖中顯示實時交通信息示
mMapView.setTraffic(true); 運行效果圖如下:
f.顯示衛星圖(衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。)
// 顯示衛星圖
mMapView.setSatellite(true);
運行效果圖如下:

完整代碼如下:
package com.android.baidu.map;
import android.app.Activity;
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.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
- 基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。
@author android_ls / public class BaiduMapBaseActivity extends Activity {
/*地圖引擎管理類/ private BMapManager mBMapManager = null;
/*顯示地圖的View/ private MapView mMapView = null;
/**
- 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"myapp"是必須要有的)。
- 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。
*/ public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
// 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯 mBMapManager = new BMapManager(this.getApplicationContext()); mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {
@Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "您的網絡出錯啦!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // 授權Key錯誤: Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "請在 DemoApplication.java文件輸入正確的授權Key!", Toast.LENGTH_LONG).show(); } }});
setContentView(R.layout.main);
mMapView = (MapView) this.findViewById(R.id.bmapsView); // 設置啟用內置的縮放控件 mMapView.setBuiltInZoomControls(true);
// 獲取地圖控制器,可以用它控制平移和縮放 MapController mMapController = mMapView.getController();
// 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
// 北京天安門的經緯度:39.915 1E6,116.404 1E6 /* GeoPoint mGeoPoint = new GeoPoint(
(int) (39.915 * 1E6), (int) (116.404 * 1E6));*/// 上海市浦東新區的GPS緯度經度值:31.224078,121.540419 GeoPoint mGeoPoint = new GeoPoint(
(int) (31.224078 * 1E6), (int) (121.540419 * 1E6));// 設置地圖的中心點 mMapController.setCenter(mGeoPoint); // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。 mMapController.setZoom(13);
// 當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。 // 在地圖中顯示實時交通信息示 // mMapView.setTraffic(true);
// 衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。 // 顯示衛星圖,屏掉 mMapView.setTraffic(true);這行代碼。 mMapView.setSatellite(true);
}
// 重寫以下方法,管理API @Override protected void onResume() { mMapView.onResume(); if (mBMapManager != null) {
mBMapManager.start();} super.onResume(); }
@Override protected void onPause() { mMapView.onPause(); if (mBMapManager != null) {
mBMapManager.stop();} super.onPause(); }
@Override protected void onDestroy() { mMapView.destroy(); if (mBMapManager != null) {
mBMapManager.destroy(); mBMapManager = null;} super.onDestroy(); } }</pre>來自:http://blog.csdn.net/android_ls/article/details/8577725