標籤:android開發 controls 初始化 通過 min height intern class 縮放
近期做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(); } } }); } @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中申明許可權和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顯示地圖及解決顯示空白網格問題