1. 程式人生 > >[android] 百度地圖開發 (一).申請AK顯示地圖及解決顯示空白網格問題

[android] 百度地圖開發 (一).申請AK顯示地圖及解決顯示空白網格問題

定義 gps 官方 應用程序 2.x lns settings sap xmlns

近期做android百度地圖,可是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so顯示百度地圖時總是遇到問題——僅僅顯示網格而沒有顯示地圖,網絡連接和APIKey申請都是正確的,就是不知道為什麽不能顯示,網上也有非常多人遇到這個問題,有的是SDK更新不兼容.並且網上非常多百度地圖都是使用V2.3.1版本號,後來沒有辦法僅僅有通過baidumapapi_v2_4_1.jar完畢顯示地圖.
當中須要註意的是使用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
首先,註冊成為一名百度開發人員.

技術分享 提交註冊成功後例如以下圖所看到的.
技術分享
點擊"去創建應用>>",例如以下圖所看到的,這裏顯示你的應用列表.

技術分享
此時點擊“創建應用”就可以申請APIKey,選擇類型曾經我們見過的博客書籍一般是選擇"for mobile"應用類型,這裏已經沒有該選項了,故我選擇"for Android",同一時候輸入安全碼!
技術分享
這裏你可能疑惑"安全碼"是什麽?

它是由"數字簽名;包名"組成,當中數字簽名是我們打包程序時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

技術分享
點擊"提交"後就可以獲取的AK:QwaNhFQ0ty2QmdYh3Nrr0gQx
技術分享


二.配置項目調用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文件.例如以下圖所看到的:

技術分享 當中該project包名為com.eample.baidumapshow,libs文件夾用於存放第三方Jar包,armeabi文件夾存放NDK生成so文件調用其C/C++函數庫.同一時候須要導入jar包,右鍵project->"Properties(屬性)"->"Java構建路徑",例如以下圖所看到的加入JAR.
技術分享


三.源碼顯示百度地圖

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.執行效果例如以下圖所看到的
技術分享 技術分享
最後希望文章對大家有所幫助,這是我幫同學做百度地圖簡單研究的一篇基礎性文章,當中後面準備講講百度地圖POI興趣搜索和加入標註等功能吧!對於前面的問題我也不知道為什麽總是顯示網格而沒有地圖,可是通過V2_4_1能顯示地圖.
我推測其原因是曾經申請的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

[android] 百度地圖開發 (一).申請AK顯示地圖及解決顯示空白網格問題