Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android百度地圖SDK版本v2.0.0試用

Android百度地圖SDK版本v2.0.0試用

編輯:Android開發實例

最近在研究百度地圖的API使用,在使用過程中遇到些問題,有些心得吧,記錄下來,希望能幫助到在項目中用到百度地圖的朋友。

      一、開發前的准備工作:

      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文件中添加使用權限:

  1. <!-- 使用網絡功能所需權限 --> 
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 
  3. </uses-permission> 
  4. <uses-permission android:name="android.permission.INTERNET" > 
  5. </uses-permission> 
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > 
  7. </uses-permission> 
  8. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > 
  9. </uses-permission> 
  10.  
  11. <!-- 讀取手機的當前狀態權限,沒有的話會報錯,這個是使用百度地圖API必須的 --> 
  12. <uses-permission android:name="android.permission.READ_PHONE_STATE" > 
  13. </uses-permission> 
  14.  
  15. <!--Cache功能需要讀寫外部存儲器 ,若沒這個權限,地圖加載不出來--> 
  16. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > 
  17. </uses-permission> 

           4、添加對多種屏幕的支持:

 

  1. <!--   
  2.             添加屏幕支持  
  3.      android:anyDensity="true"   
  4.     這個屬性指明應用程序是否包含了能夠適用於任何屏幕密度的資源。  
  5.     對於支持Android1.6(API Level 4)和更高版本的應用程序,這個屬性的默認值是true,  
  6.     並且除非絕對的確認這是應用程序正常工作所必須的,否則不應該把它設置為false。  
  7.     只是在應用程序直接操作位圖時才需要禁止這個屬性。  
  8.        
  9.      android:largeScreens="true" 
  10.       這個屬性用於指示應用程序是否支持較大外形的屏幕。  
  11.       一個large類型的屏幕被定義成一個比normal類型的手持設備的屏幕明顯還要大的屏幕,  
  12.       並且為了讓應用程序能夠良好的使用,使用這個屬性時要特別小心,盡管可以依賴系統來調整尺寸,  
  13.       以便能夠填充屏幕。  
  14.       這個屬性的默認值實際上在某些版本之間是不同的,因此最好在任何時候都明確的聲明這個屬性。  
  15.       如果設置為false,系統會啟用屏幕兼容模式,這時要格外的小心。  
  16.        
  17.      android:normalScreens="true" 
  18.       這個屬性用於指示應用程序是否支持普通外形的屏幕。  
  19.       典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被認為是普通屏幕。  
  20.       這個屬性的默認值是true。  
  21.        
  22.      android:smallScreens="true"   
  23.       這個屬性用於指定應用程序是否支持較小外形的屏幕。  
  24.       一個small類型的屏幕被定義成一個比normal(傳統的HVGA)類型的屏幕還要小的屏幕。  
  25.       外部服務(如Google Play)不會把不支持小屏的應用程序提供給小屏設備,  
  26.       因為很少有能夠確保該應用程序在小屏幕的設備上正常工作的平台。這個屬性的默認值是true。  
  27.        
  28.      android:resizeable="true"   
  29.              這個屬性用於指示針對不同的屏幕尺寸,應用程序是否可以調整尺寸。默認值是true。  
  30.     --> 
  31.    <supports-screens 
  32.        android:anyDensity="true" 
  33.        android:largeScreens="true" 
  34.        android:normalScreens="true" 
  35.        android:resizeable="true" 
  36.        android:smallScreens="true" /> 

      5、配置Activity:

  1. <activity 
  2.            android:configChanges="orientation|keyboardHidden" 
  3.            android:label="@string/app_name" 
  4.            android:name=".BaiduMapBaseActivity" 
  5.            android:screenOrientation="sensor" > 
  6.            <intent-filter > 
  7.                <action android:name="android.intent.action.MAIN" /> 
  8.  
  9.                <category android:name="android.intent.category.LAUNCHER" /> 
  10.            </intent-filter> 
  11.        </activity> 

         6、在布局xml文件中添加地圖控件:

  1. <com.baidu.mapapi.map.MapView 
  2.        android:id="@+id/bmapsView" 
  3.        android:layout_width="fill_parent" 
  4.        android:layout_height="fill_parent" 
  5.        android:clickable="true" /> 

      7、 創建地圖Activity,並import相關類:

               a. 創建地圖引擎管理類對象,並初始化。

  1. // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯  
  2.      mBMapManager = new BMapManager(this.getApplicationContext());  
  3.      mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  4.  
  5.          @Override 
  6.          public void onGetNetworkState(int iError) {  
  7.              if (iError == MKEvent.ERROR_NETWORK_CONNECT) {  
  8.                  Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),   
  9.                          "您的網絡出錯啦!", Toast.LENGTH_LONG).show();  
  10.              }  
  11.          }  
  12.  
  13.          @Override 
  14.          public void onGetPermissionState(int iError) {  
  15.              if (iError == MKEvent.ERROR_PERMISSION_DENIED) {  
  16.                  // 授權Key錯誤:  
  17.                  Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),  
  18.                          "請在 DemoApplication.java文件輸入正確的授權Key!", Toast.LENGTH_LONG).show();  
  19.              }  
  20.          }  
  21.      }); 

          b.通過ID獲取代表地圖顯示組件的MapView對象,並設置啟用內置的縮放控件。

  1. mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  2. // 設置啟用內置的縮放控件  
  3. mMapView.setBuiltInZoomControls(true); 

               c.獲取地圖控制器對象,並設置地圖的中心點及縮放級別。

  1.   // 獲取地圖控制器,可以用它控制平移和縮放  
  2.   MapController mMapController = mMapView.getController();  
  3.  
  4. // 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)  
  5.  
  6. // 北京天安門的經緯度:39.915 * 1E6,116.404 * 1E6  
  7. // GeoPoint mGeoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));  
  8.  
  9. // 上海市浦東新區的GPS緯度經度值:31.224078,121.540419  
  10. GeoPoint mGeoPoint = new GeoPoint(  
  11.         (int) (31.224078 * 1E6),   
  12.         (int) (121.540419 * 1E6));  
  13.  
  14. // 設置地圖的中心點  
  15. mMapController.setCenter(mGeoPoint);  
  16. // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。   
  17. mMapController.setZoom(13); 

           d.重寫Activity的生命周期回調方法onResume()、onPause()和onDestroy(),管理地圖引擎管理類對象和顯示對象生命周期。

  1. @Override 
  2.   protected void onResume() {  
  3.       mMapView.onResume();  
  4.       if (mBMapManager != null) {  
  5.           mBMapManager.start();  
  6.       }  
  7.       super.onResume();  
  8.   }  
  9.  
  10.   @Override 
  11.   protected void onPause() {  
  12.       mMapView.onPause();  
  13.       if (mBMapManager != null) {  
  14.           mBMapManager.stop();  
  15.       }  
  16.       super.onPause();  
  17.   }  
  18.  
  19.   @Override 
  20.   protected void onDestroy() {  
  21.       mMapView.destroy();  
  22.       if (mBMapManager != null) {  
  23.           mBMapManager.destroy();  
  24.           mBMapManager = null;  
  25.       }  
  26.       super.onDestroy();  
  27.   } 

經過以上這些步驟,加載的是上海市浦東新區地圖(基礎圖),運行工程效果圖如下:

注:基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。

            e.在地圖中顯示實時交通信息示圖(當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。)

  1. // 在地圖中顯示實時交通信息示  
  2.  mMapView.setTraffic(true); 

        運行效果圖如下:

 

           f.顯示衛星圖(衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。)

  1. // 顯示衛星圖  
  2. mMapView.setSatellite(true); 

運行效果圖如下:


 

 

  1. package com.android.baidu.map;  
  2.  
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.widget.Toast;  
  6.  
  7. import com.baidu.mapapi.BMapManager;  
  8. import com.baidu.mapapi.MKGeneralListener;  
  9. import com.baidu.mapapi.map.MKEvent;  
  10. import com.baidu.mapapi.map.MapController;  
  11. import com.baidu.mapapi.map.MapView;  
  12. import com.baidu.platform.comapi.basestruct.GeoPoint;  
  13.  
  14. /**  
  15.  * 基本的地圖圖層,包括若干個縮放級別,顯示基本的地圖信息,包括道路、街道、學校、公園等內容。  
  16.  * @author android_ls  
  17.  *  
  18.  */ 
  19. public class BaiduMapBaseActivity extends Activity {  
  20.  
  21.     /**地圖引擎管理類*/ 
  22.     private BMapManager mBMapManager = null;  
  23.  
  24.     /**顯示地圖的View*/ 
  25.     private MapView mMapView = null;  
  26.  
  27.     /**  
  28.      * 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。  
  29.      * 百度地圖SDK提供的服務是免費的,接口無使用次數限制。您需先申請密鑰(key),才可使用該套SDK。  
  30.      * */ 
  31.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";  
  32.  
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.  
  37.         // 注意:請在調用setContentView前初始化BMapManager對象,否則會報錯  
  38.         mBMapManager = new BMapManager(this.getApplicationContext());  
  39.         mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {  
  40.  
  41.             @Override 
  42.             public void onGetNetworkState(int iError) {  
  43.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {  
  44.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),  
  45.                             "您的網絡出錯啦!",   
  46.                             Toast.LENGTH_LONG).show();  
  47.                 }  
  48.             }  
  49.  
  50.             @Override 
  51.             public void onGetPermissionState(int iError) {  
  52.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {  
  53.                     // 授權Key錯誤:  
  54.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),   
  55.                             "請在 DemoApplication.java文件輸入正確的授權Key!",   
  56.                             Toast.LENGTH_LONG).show();  
  57.                 }  
  58.             }  
  59.         });  
  60.  
  61.         setContentView(R.layout.main);  
  62.  
  63.         mMapView = (MapView) this.findViewById(R.id.bmapsView);  
  64.         // 設置啟用內置的縮放控件  
  65.         mMapView.setBuiltInZoomControls(true);  
  66.  
  67.         // 獲取地圖控制器,可以用它控制平移和縮放  
  68.         MapController mMapController = mMapView.getController();  
  69.  
  70.         // 用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)  
  71.  
  72.         // 北京天安門的經緯度:39.915 * 1E6,116.404 * 1E6  
  73.        /* GeoPoint mGeoPoint = new GeoPoint(  
  74.                 (int) (39.915 * 1E6),   
  75.                 (int) (116.404 * 1E6));*/ 
  76.  
  77.         // 上海市浦東新區的GPS緯度經度值:31.224078,121.540419  
  78.         GeoPoint mGeoPoint = new GeoPoint(  
  79.                 (int) (31.224078 * 1E6),   
  80.                 (int) (121.540419 * 1E6));  
  81.  
  82.         // 設置地圖的中心點  
  83.         mMapController.setCenter(mGeoPoint);  
  84.         // 設置地圖的縮放級別。 這個值的取值范圍是[3,18]。   
  85.         mMapController.setZoom(13);  
  86.  
  87.         // 當前,全國范圍內已支持多個城市實時路況查詢,且會陸續開通其他城市。  
  88.         // 在地圖中顯示實時交通信息示  
  89.         // mMapView.setTraffic(true);  
  90.  
  91.         // 衛星地圖是衛星拍攝的真實的地理面貌,所以衛星地圖可用來檢測地面的信息,你可以了解到地理位置,地形等。  
  92.         // 顯示衛星圖,屏掉 mMapView.setTraffic(true);這行代碼。  
  93.         mMapView.setSatellite(true);  
  94.  
  95.     }  
  96.  
  97.     // 重寫以下方法,管理API  
  98.     @Override 
  99.     protected void onResume() {  
  100.         mMapView.onResume();  
  101.         if (mBMapManager != null) {  
  102.             mBMapManager.start();  
  103.         }  
  104.         super.onResume();  
  105.     }  
  106.  
  107.     @Override 
  108.     protected void onPause() {  
  109.         mMapView.onPause();  
  110.         if (mBMapManager != null) {  
  111.             mBMapManager.stop();  
  112.         }  
  113.         super.onPause();  
  114.     }  
  115.  
  116.     @Override 
  117.     protected void onDestroy() {  
  118.         mMapView.destroy();  
  119.         if (mBMapManager != null) {  
  120.             mBMapManager.destroy();  
  121.             mBMapManager = null;  
  122.         }  
  123.         super.onDestroy();  
  124.     }  

 

轉自:http://blog.csdn.net/android_ls/article/details/8577725

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved