[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
生活随笔
收集整理的這篇文章主要介紹了
[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
? ? 最近做android百度地圖,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so顯示百度地圖時(shí)總是遇到問(wèn)題——只顯示網(wǎng)格而沒(méi)有顯示地圖,網(wǎng)絡(luò)連接和APIKey申請(qǐng)都是正確的,就是不知道為什么不能顯示,網(wǎng)上也有很多人遇到這個(gè)問(wèn)題,有的是SDK更新不兼容.而且網(wǎng)上很多百度地圖都是使用V2.3.1版本,后來(lái)沒(méi)有辦法只有通過(guò)baidumapapi_v2_4_1.jar完成顯示地圖.
??? 其中需要注意的是使用2.3.1時(shí)調(diào)用manager.init("APIKey",null)初始化地圖,而2.4.1版本是通過(guò)在AndroidManifest.xml的meta-data中輸入AK.
? ?PS:這僅僅是一篇Android開(kāi)發(fā)百度地圖的基礎(chǔ)文章,網(wǎng)上資料也很多,但該方法可行.參考郭神《Android第一行代碼》中方法也是v2.3.1只能顯示網(wǎng)格而沒(méi)有地圖.
? ?點(diǎn)擊"去創(chuàng)建應(yīng)用>>",如下圖所示,這里顯示你的應(yīng)用列表.
? ?此時(shí)點(diǎn)擊“創(chuàng)建應(yīng)用”即可申請(qǐng)APIKey,選擇類型以前我們見(jiàn)過(guò)的博客書(shū)籍通常是選擇"for mobile"應(yīng)用類型,這里已經(jīng)沒(méi)有該選項(xiàng)了,故我選擇"for Android",同時(shí)輸入安全碼!
? ? 這里你可能疑惑"安全碼"是什么?它是由"數(shù)字簽名;包名"組成,其中數(shù)字簽名是我們打包程序時(shí)keystore的SHA1指紋,通過(guò)點(diǎn)擊Eclipse的"窗體(Window)->首選項(xiàng)(Preferences)->Android->Build"查看,同時(shí)也可參照上面官方文檔鏈接通過(guò)cmd獲取.而包名就是應(yīng)用程序?qū)?yīng)的包名.如下:
? ? E5:BA:71:31:9D:A3:BF:92:8D:2E:8F:3A:6D:0A:93:5B:3D:36:59:08;com.example.baidumapshow
? ?點(diǎn)擊"提交"后即可獲取的AK:QwaNhFQ0ty2QmdYh3Nrr0gQx
public class MainActivity extends Activity {//BMapManager 對(duì)象管理地圖、定位、搜索功能private BMapManager mBMapManager; //MapView 地圖主控件 private MapView mapView = null; //MapController 完成地圖控制private MapController mMapController = null; //MKMapViewListener 用于處理地圖事件回調(diào) MKMapViewListener mMapListener = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 創(chuàng)建對(duì)象BMapManager并初始化操作* V2.3.1中init(APIKey,null) V2.4.1在AndroidManifest中賦值A(chǔ)K* 注意 初始化操作在setContentView()前*/mBMapManager = new BMapManager(getApplication()); mBMapManager.init(null); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //獲取地圖控制器 取得MapController實(shí)例mMapController = mapView.getController(); //設(shè)置地圖是否響應(yīng)點(diǎn)擊事件mMapController.enableClick(true); //設(shè)置地圖縮放級(jí)別 3-19級(jí)別 級(jí)別越高 信息越詳細(xì)mMapController.setZoom(16); //顯示內(nèi)置縮放控件mapView.setBuiltInZoomControls(true); /*** 獲取學(xué)校經(jīng)緯度 設(shè)置地圖中心點(diǎn)*/GeoPoint point = new GeoPoint((int)(39.96703 * 1E6), (int)(116.323772 * 1E6)); mMapController.setCenter(point); mapView.regMapViewListener(mBMapManager, new MKMapViewListener() { /** * 地圖移動(dòng)完成時(shí)會(huì)回調(diào)此接口方法 */ @Override public void onMapMoveFinish() { Toast.makeText(MainActivity.this, "地圖移動(dòng)", Toast.LENGTH_SHORT).show();} /** * 地圖加載完畢回調(diào)此接口方法 */ @Override public void onMapLoadFinish() { Toast.makeText(MainActivity.this, "地圖載入", Toast.LENGTH_SHORT).show();} /** * 地圖完成帶動(dòng)畫(huà)的操作(如: animationTo())后,此回調(diào)被觸發(fā) */ @Override public void onMapAnimationFinish() { } /** * 當(dāng)調(diào)用過(guò) mMapView.getCurrentMap()后,此回調(diào)會(huì)被觸發(fā) * 可在此保存截圖至存儲(chǔ)設(shè)備 */ @Override public void onGetCurrentMap(Bitmap arg0) { } /** * 點(diǎn)擊地圖上被標(biāo)記的點(diǎn)回調(diào)此方法 * */ @Override public void onClickMapPoi(MapPoi arg0) { if (arg0 != null){ Toast.makeText(MainActivity.this, arg0.strText, Toast.LENGTH_SHORT).show();} } }); }@Overrideprotected void onResume() {mapView.onResume();if (mBMapManager != null) {mBMapManager.start();}super.onResume();}@Overrideprotected void onDestroy() {mapView.destroy();if (mBMapManager != null) {mBMapManager.destroy();mBMapManager = null;}super.onDestroy();}@Overrideprotected void onPause() {mapView.onPause();if (mBMapManager != null) {mBMapManager.stop();}super.onPause();} } ? ?3.AndroidManifest.xml中申明權(quán)限和APIKey
?? 其中最重要的是添加APIKey,方法mBMapManager.init(null)調(diào)用.
???<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-sdkandroid:minSdkVersion="19"android:targetSdkVersion="19" /><!-- 獲取網(wǎng)絡(luò)狀態(tài) --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 訪問(wèn)網(wǎng)絡(luò) --><uses-permission android:name="android.permission.INTERNET" /><!-- 獲取WiFi狀態(tài) --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 允許程序?qū)懭胪獠看鎯?chǔ),如SD卡上寫(xiě)文件 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><!-- 讀取電話狀態(tài) --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.CALL_PHONE" /><!-- 獲取精確位置 GPS芯片接收衛(wèi)星的定位信息,定位精度達(dá)10米以內(nèi) --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 通過(guò)WiFi或移動(dòng)基站的方式獲取用戶錯(cuò)略的經(jīng)緯度信息 --><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" /><applicationandroid: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> <activityandroid: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.運(yùn)行效果如下圖所示
? ?
? ??最后希望文章對(duì)大家有所幫助,這是我?guī)屯瑢W(xué)做百度地圖簡(jiǎn)單研究的一篇基礎(chǔ)性文章,其中后面準(zhǔn)備講講百度地圖POI興趣搜索和添加標(biāo)注等功能吧!對(duì)于前面的問(wèn)題我也不知道為什么總是顯示網(wǎng)格而沒(méi)有地圖,但是通過(guò)V2_4_1能顯示地圖.
? ? 我猜測(cè)其原因是以前申請(qǐng)的APIKey調(diào)用方法可以實(shí)現(xiàn)顯示地圖,但是由于百度新更新的SDK方法不兼容,現(xiàn)在申請(qǐng)的APIKey需要使用新的方法,故上面的才能顯示,個(gè)人意見(jiàn),不知道是否正確啊!
??? (By:Eastmount 2014-12-22 夜2點(diǎn)?http://blog.csdn.net/eastmount/)
參考資料:
??? 1.郭霖大神《Android第一行代碼》第11章基于百度地圖的開(kāi)發(fā)
??? 2.xiaanming大神文章?http://blog.csdn.net/xiaanming/article/details/11171581
??? 3.百度官方文檔和文庫(kù)?http://wenku.baidu.com/view/86bab0b3f524ccbff12184bd.html
??? 其中需要注意的是使用2.3.1時(shí)調(diào)用manager.init("APIKey",null)初始化地圖,而2.4.1版本是通過(guò)在AndroidManifest.xml的meta-data中輸入AK.
? ?PS:這僅僅是一篇Android開(kāi)發(fā)百度地圖的基礎(chǔ)文章,網(wǎng)上資料也很多,但該方法可行.參考郭神《Android第一行代碼》中方法也是v2.3.1只能顯示網(wǎng)格而沒(méi)有地圖.
一.開(kāi)發(fā)前申請(qǐng)APIKey
參考資料:
? ? 官方開(kāi)發(fā)SDK指南?http://developer.baidu.com/map/sdkandev-14.htm
? ? 百度地圖申請(qǐng)密鑰?http://lbsyun.baidu.com/apiconsole/key
? ? 首先,注冊(cè)成為一名百度開(kāi)發(fā)者.
? ?點(diǎn)擊"去創(chuàng)建應(yīng)用>>",如下圖所示,這里顯示你的應(yīng)用列表.
? ?此時(shí)點(diǎn)擊“創(chuàng)建應(yīng)用”即可申請(qǐng)APIKey,選擇類型以前我們見(jiàn)過(guò)的博客書(shū)籍通常是選擇"for mobile"應(yīng)用類型,這里已經(jīng)沒(méi)有該選項(xiàng)了,故我選擇"for Android",同時(shí)輸入安全碼!
? ? 這里你可能疑惑"安全碼"是什么?它是由"數(shù)字簽名;包名"組成,其中數(shù)字簽名是我們打包程序時(shí)keystore的SHA1指紋,通過(guò)點(diǎn)擊Eclipse的"窗體(Window)->首選項(xiàng)(Preferences)->Android->Build"查看,同時(shí)也可參照上面官方文檔鏈接通過(guò)cmd獲取.而包名就是應(yīng)用程序?qū)?yīng)的包名.如下:
? ? E5:BA:71:31:9D:A3:BF:92:8D:2E:8F:3A:6D:0A:93:5B:3D:36:59:08;com.example.baidumapshow
? ?點(diǎn)擊"提交"后即可獲取的AK:QwaNhFQ0ty2QmdYh3Nrr0gQx
二.配置項(xiàng)目調(diào)用SDK
? ? 下載Android SDK地址:
??? http://developer.baidu.com/map/sdkandev-download.htm
? ? 在創(chuàng)建好的應(yīng)用程序BaiduMapShow項(xiàng)目中l(wèi)ibs目錄下復(fù)制baidumapapi_v2_4_1.jar文件,同時(shí)libs目錄下新建armeabi目錄,并拷貝libBaiduMapSDK_v2_4_1.so文件.如下圖所示:
三.源代碼顯示百度地圖
? ? 1.activity_main.xml布局文件
? ? 布局文件中通過(guò)加載百度地圖控件MapView,它是由百度提供的自定義控件故需要加上完整包名,同時(shí)該控件需要接受點(diǎn)擊事件clickable設(shè)置為true.
public class MainActivity extends Activity {//BMapManager 對(duì)象管理地圖、定位、搜索功能private BMapManager mBMapManager; //MapView 地圖主控件 private MapView mapView = null; //MapController 完成地圖控制private MapController mMapController = null; //MKMapViewListener 用于處理地圖事件回調(diào) MKMapViewListener mMapListener = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);/*** 創(chuàng)建對(duì)象BMapManager并初始化操作* V2.3.1中init(APIKey,null) V2.4.1在AndroidManifest中賦值A(chǔ)K* 注意 初始化操作在setContentView()前*/mBMapManager = new BMapManager(getApplication()); mBMapManager.init(null); setContentView(R.layout.activity_main); mapView = (MapView) findViewById(R.id.map_view); //獲取地圖控制器 取得MapController實(shí)例mMapController = mapView.getController(); //設(shè)置地圖是否響應(yīng)點(diǎn)擊事件mMapController.enableClick(true); //設(shè)置地圖縮放級(jí)別 3-19級(jí)別 級(jí)別越高 信息越詳細(xì)mMapController.setZoom(16); //顯示內(nèi)置縮放控件mapView.setBuiltInZoomControls(true); /*** 獲取學(xué)校經(jīng)緯度 設(shè)置地圖中心點(diǎn)*/GeoPoint point = new GeoPoint((int)(39.96703 * 1E6), (int)(116.323772 * 1E6)); mMapController.setCenter(point); mapView.regMapViewListener(mBMapManager, new MKMapViewListener() { /** * 地圖移動(dòng)完成時(shí)會(huì)回調(diào)此接口方法 */ @Override public void onMapMoveFinish() { Toast.makeText(MainActivity.this, "地圖移動(dòng)", Toast.LENGTH_SHORT).show();} /** * 地圖加載完畢回調(diào)此接口方法 */ @Override public void onMapLoadFinish() { Toast.makeText(MainActivity.this, "地圖載入", Toast.LENGTH_SHORT).show();} /** * 地圖完成帶動(dòng)畫(huà)的操作(如: animationTo())后,此回調(diào)被觸發(fā) */ @Override public void onMapAnimationFinish() { } /** * 當(dāng)調(diào)用過(guò) mMapView.getCurrentMap()后,此回調(diào)會(huì)被觸發(fā) * 可在此保存截圖至存儲(chǔ)設(shè)備 */ @Override public void onGetCurrentMap(Bitmap arg0) { } /** * 點(diǎn)擊地圖上被標(biāo)記的點(diǎn)回調(diào)此方法 * */ @Override public void onClickMapPoi(MapPoi arg0) { if (arg0 != null){ Toast.makeText(MainActivity.this, arg0.strText, Toast.LENGTH_SHORT).show();} } }); }@Overrideprotected void onResume() {mapView.onResume();if (mBMapManager != null) {mBMapManager.start();}super.onResume();}@Overrideprotected void onDestroy() {mapView.destroy();if (mBMapManager != null) {mBMapManager.destroy();mBMapManager = null;}super.onDestroy();}@Overrideprotected void onPause() {mapView.onPause();if (mBMapManager != null) {mBMapManager.stop();}super.onPause();} } ? ?3.AndroidManifest.xml中申明權(quán)限和APIKey
?? 其中最重要的是添加APIKey,方法mBMapManager.init(null)調(diào)用.
???<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-sdkandroid:minSdkVersion="19"android:targetSdkVersion="19" /><!-- 獲取網(wǎng)絡(luò)狀態(tài) --><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><!-- 訪問(wèn)網(wǎng)絡(luò) --><uses-permission android:name="android.permission.INTERNET" /><!-- 獲取WiFi狀態(tài) --><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /><!-- 允許程序?qū)懭胪獠看鎯?chǔ),如SD卡上寫(xiě)文件 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><!-- 讀取電話狀態(tài) --><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.CALL_PHONE" /><!-- 獲取精確位置 GPS芯片接收衛(wèi)星的定位信息,定位精度達(dá)10米以內(nèi) --><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /><!-- 通過(guò)WiFi或移動(dòng)基站的方式獲取用戶錯(cuò)略的經(jīng)緯度信息 --><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" /><applicationandroid: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> <activityandroid: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.運(yùn)行效果如下圖所示
? ?
? ??最后希望文章對(duì)大家有所幫助,這是我?guī)屯瑢W(xué)做百度地圖簡(jiǎn)單研究的一篇基礎(chǔ)性文章,其中后面準(zhǔn)備講講百度地圖POI興趣搜索和添加標(biāo)注等功能吧!對(duì)于前面的問(wèn)題我也不知道為什么總是顯示網(wǎng)格而沒(méi)有地圖,但是通過(guò)V2_4_1能顯示地圖.
? ? 我猜測(cè)其原因是以前申請(qǐng)的APIKey調(diào)用方法可以實(shí)現(xiàn)顯示地圖,但是由于百度新更新的SDK方法不兼容,現(xiàn)在申請(qǐng)的APIKey需要使用新的方法,故上面的才能顯示,個(gè)人意見(jiàn),不知道是否正確啊!
??? (By:Eastmount 2014-12-22 夜2點(diǎn)?http://blog.csdn.net/eastmount/)
參考資料:
??? 1.郭霖大神《Android第一行代碼》第11章基于百度地圖的開(kāi)發(fā)
??? 2.xiaanming大神文章?http://blog.csdn.net/xiaanming/article/details/11171581
??? 3.百度官方文檔和文庫(kù)?http://wenku.baidu.com/view/86bab0b3f524ccbff12184bd.html
總結(jié)
以上是生活随笔為你收集整理的[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [Android] AlertDialo
- 下一篇: [android] 百度地图开发 (二)