當中須要注意的是使用2.3.1時調用manager.init("APIKey",null)初始化地圖,而2.4.1版本號是通過在AndroidManifest.xml的meta-data中輸入AK.
PS:這不過一篇Android開發百度地圖的基礎文章,網上資料也非常多,但該方法可行.參考郭神《Android第一行代碼》中方法也是v2.3.1只能顯示網格而沒有地圖.
一.開發前申請APIKey
參考資料:
官方開發SDK指南 http://developer.baidu.com/map/sdkandev-14.htm
百度地圖申請密鑰 http://lbsyun.baidu.com/apiconsole/key
首先,注冊成為一名百度開發人員.


它是由"數字簽名;包名"組成,當中數字簽名是我們打包程序時keystore的SHA1指紋,通過點擊Eclipse的"窗口(Window)->首選項(Preferences)->Android->Build"查看,同一時候也可參照上面官方文檔鏈接通過cmd獲取.而包名就是應用程序相應的包名.例如以下:
E5:BA:71:31:9D:A3:BF:92:8D:2E:8F:3A:6D:0A:93:5B:3D:36:59:08;com.example.baidumapshow
二.配置項目調用SDK
下載Android SDK地址:
http://developer.baidu.com/map/sdkandev-download.htm
在創建好的應用程序BaiduMapShow項目中libs文件夾下復制baidumapapi_v2_4_1.jar文件,同一時候libs文件夾下新建armeabi文件夾,並拷貝libBaiduMapSDK_v2_4_1.so文件.例如以下圖所看到的:
三.源碼顯示百度地圖
1.activity_main.xml布局文件
布局文件里通過載入百度地圖控件MapView,它是由百度提供的自己定義控件故須要加上完整包名,同一時候該控件須要接受點擊事件clickable設置為true.
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.baidumapshow.MainActivity"
tools:ignore="MergeRootFrame" >
<com.baidu.mapapi.map.MapView
android:id="@+id/map_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" />
</FrameLayout>
2.MainActivity.java文件public class MainActivity extends Activity {
//BMapManager 對象管理地圖、定位、搜索功能
private BMapManager mBMapManager;
//MapView 地圖主控件
private MapView mapView = null;
//MapController 完畢地圖控制
private MapController mMapController = null;
//MKMapViewListener 用於處理地圖事件回調
MKMapViewListener mMapListener = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 創建對象BMapManager並初始化操作
* V2.3.1中init(APIKey,null) V2.4.1在AndroidManifest中賦值AK
* 注意 初始化操作在setContentView()前
*/
mBMapManager = new BMapManager(getApplication());
mBMapManager.init(null);
setContentView(R.layout.activity_main);
mapView = (MapView) findViewById(R.id.map_view);
//獲取地圖控制器 取得MapController實例
mMapController = mapView.getController();
//設置地圖是否響應點擊事件
mMapController.enableClick(true);
//設置地圖縮放級別 3-19級別 級別越高 信息越具體
mMapController.setZoom(16);
//顯示內置縮放控件
mapView.setBuiltInZoomControls(true);
/**
* 獲取學校經緯度 設置地圖中心點
*/
GeoPoint point = new GeoPoint((int)(39.96703 * 1E6), (int)(116.323772 * 1E6));
mMapController.setCenter(point);
mapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
/**
* 地圖移動完畢時會回調此接口方法
*/
@Override
public void onMapMoveFinish() {
Toast.makeText(MainActivity.this, "地圖移動", Toast.LENGTH_SHORT).show();
}
/**
* 地圖載入完畢回調此接口方法
*/
@Override
public void onMapLoadFinish() {
Toast.makeText(MainActivity.this, "地圖載入", Toast.LENGTH_SHORT).show();
}
/**
* 地圖完畢帶動畫的操作(如: animationTo())后,此回調被觸發
*/
@Override
public void onMapAnimationFinish() {
}
/**
* 當調用過 mMapView.getCurrentMap()后。此回調會被觸發
* 可在此保存截圖至存儲設備
*/
@Override
public void onGetCurrentMap(Bitmap arg0) {
}
/**
* 點擊地圖上被標記的點回調此方法
*
*/
@Override
public void onClickMapPoi(MapPoi arg0) {
if (arg0 != null){
Toast.makeText(MainActivity.this, arg0.strText, Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
protected void onResume() {
mapView.onResume();
if (mBMapManager != null) {
mBMapManager.start();
}
super.onResume();
}
@Override
protected void onDestroy() {
mapView.destroy();
if (mBMapManager != null) {
mBMapManager.destroy();
mBMapManager = null;
}
super.onDestroy();
}
@Override
protected void onPause() {
mapView.onPause();
if (mBMapManager != null) {
mBMapManager.stop();
}
super.onPause();
}
}
3.AndroidManifest.xml中申明權限和APIKey當中最重要的是加入APIKey,方法mBMapManager.init(null)調用.
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="QwaNhFQ0ty2QmdYh3Nrr0gQx">
</meta-data>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.baidumapshow"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="19"
android:targetSdkVersion="19" />
<!-- 獲取網絡狀態 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 訪問網絡 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 獲取WiFi狀態 -->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 同意程序寫入外部存儲,如SD卡上寫文件 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 讀取電話狀態 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<!-- 獲取精確位置 GPS芯片接收衛星的定位信息,定位精度達10米以內 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通過WiFi或移動基站的方式獲取用戶錯略的經緯度信息 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 獲取模擬定位信息 -->
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="QwaNhFQ0ty2QmdYh3Nrr0gQx">
</meta-data>
<activity
android:name="com.example.baidumapshow.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
4.執行效果例如以下圖所看到的

我推測其原因是曾經申請的APIKey調用方法能夠實現顯示地圖,可是因為百度新更新的SDK方法不兼容,如今申請的APIKey須要使用新的方法,故上面的才干顯示,個人意見,不知道是否正確啊!
(By:Eastmount 2014-12-22 夜2點 http://blog.csdn.net/eastmount/)
參考資料:
1.郭霖大神《Android第一行代碼》第11章基於百度地圖的開發
2.xiaanming大神文章 http://blog.csdn.net/xiaanming/article/details/11171581
3.百度官方文檔和文庫 http://wenku.baidu.com/view/86bab0b3f524ccbff12184bd.html
