百度地图SDKV2.0图层加载

http://www.apkbus.com/android-109187-1-1.html

SDK版本v2.0.0初探

一、开发前的准备工作:

      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目录下,拷贝完成后的工程目录如下图所示:

        百度地图SDKV2.0图层加载

           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.     <!-- 读取手机的当前状态权限,没有的话会报错,这个是使用百度地图API必须的 -->

  11.     <uses-permission android:name="android.permission.READ_PHONE_STATE" >

  12.     </uses-permission>


  13.     <!--Cache功能需要读写外部存储器 ,若没这个权限,地图加载不出来-->

  14.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >

  15.     </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.                 <category android:name="android.intent.category.LAUNCHER" />

  9.             </intent-filter>

  10.         </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.             @Override

  5.             public void onGetNetworkState(int iError) {

  6.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {

  7.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),

  8.                             "您的网络出错啦!", Toast.LENGTH_LONG).show();

  9.                 }

  10.             }


  11.             @Override

  12.             public void onGetPermissionState(int iError) {

  13.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {

  14.                     // 授权Key错误:

  15.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),

  16.                             "请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show();

  17.                 }

  18.             }

  19.         });

复制代码

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.         // 北京天安门的经纬度:39.915 * 1E6,116.404 * 1E6

  6.         // GeoPoint mGeoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6));

  7.         

  8.         // 上海市浦东新区的GPS纬度经度值:31.224078,121.540419

  9.         GeoPoint mGeoPoint = new GeoPoint(

  10.                 (int) (31.224078 * 1E6),

  11.                 (int) (121.540419 * 1E6));

  12.         

  13.         // 设置地图的中心点

  14.         mMapController.setCenter(mGeoPoint);

  15.         // 设置地图的缩放级别。 这个值的取值范围是[3,18]。

  16.         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.     @Override

  10.     protected void onPause() {

  11.         mMapView.onPause();

  12.         if (mBMapManager != null) {

  13.             mBMapManager.stop();

  14.         }

  15.         super.onPause();

  16.     }


  17.     @Override

  18.     protected void onDestroy() {

  19.         mMapView.destroy();

  20.         if (mBMapManager != null) {

  21.             mBMapManager.destroy();

  22.             mBMapManager = null;

  23.         }

  24.         super.onDestroy();

  25.     }

复制代码

经过以上这些步骤,加载的是上海市浦东新区地图(基础图),运行工程效果图如下:

注:基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。

百度地图SDKV2.0图层加载

            e.在地图中显示实时交通信息示图(当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。)

  1.   // 在地图中显示实时交通信息示

  2.        mMapView.setTraffic(true);

复制代码

   运行效果图如下:

百度地图SDKV2.0图层加载

           f.显示卫星图(卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。)

  1. // 显示卫星图

  2. mMapView.setSatellite(true);

复制代码

运行效果图如下:

百度地图SDKV2.0图层加载


完整代码如下:

  1. package com.android.baidu.map;


  2. import android.app.Activity;

  3. import android.os.Bundle;

  4. import android.widget.Toast;


  5. import com.baidu.mapapi.BMapManager;

  6. import com.baidu.mapapi.MKGeneralListener;

  7. import com.baidu.mapapi.map.MKEvent;

  8. import com.baidu.mapapi.map.MapController;

  9. import com.baidu.mapapi.map.MapView;

  10. import com.baidu.platform.comapi.basestruct.GeoPoint;


  11. /**

  12. * 基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。

  13. * @author android_ls

  14. *

  15. */

  16. public class BaiduMapBaseActivity extends Activity {


  17.     /**地图引擎管理类*/

  18.     private BMapManager mBMapManager = null;


  19.     /**显示地图的View*/

  20.     private MapView mMapView = null;


  21.     /**

  22.      * 经研究发现在申请KEY时:应用名称一定要写成my_app_应用名(也就是说"my_app_"是必须要有的)。

  23.      * 百度地图SDK提供的服务是免费的,接口无使用次数限制。您需先申请**(key),才可使用该套SDK。

  24.      * */

  25.     public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";


  26.     @Override

  27.     public void onCreate(Bundle savedInstanceState) {

  28.         super.onCreate(savedInstanceState);


  29.         // 注意:请在调用setContentView前初始化BMapManager对象,否则会报错

  30.         mBMapManager = new BMapManager(this.getApplicationContext());

  31.         mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {


  32.             @Override

  33.             public void onGetNetworkState(int iError) {

  34.                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {

  35.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),

  36.                             "您的网络出错啦!",

  37.                             Toast.LENGTH_LONG).show();

  38.                 }

  39.             }


  40.             @Override

  41.             public void onGetPermissionState(int iError) {

  42.                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {

  43.                     // 授权Key错误:

  44.                     Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(),

  45.                             "请在 DemoApplication.java文件输入正确的授权Key!",

  46.                             Toast.LENGTH_LONG).show();

  47.                 }

  48.             }

  49.         });


  50.         setContentView(R.layout.main);


  51.         mMapView = (MapView) this.findViewById(R.id.bmapsView);

  52.         // 设置启用内置的缩放控件

  53.         mMapView.setBuiltInZoomControls(true);


  54.         // 获取地图控制器,可以用它控制平移和缩放

  55.         MapController mMapController = mMapView.getController();


  56.         // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)


  57.         // 北京天安门的经纬度:39.915 * 1E6,116.404 * 1E6

  58.        /* GeoPoint mGeoPoint = new GeoPoint(

  59.                 (int) (39.915 * 1E6),

  60.                 (int) (116.404 * 1E6));*/


  61.         // 上海市浦东新区的GPS纬度经度值:31.224078,121.540419

  62.         GeoPoint mGeoPoint = new GeoPoint(

  63.                 (int) (31.224078 * 1E6),

  64.                 (int) (121.540419 * 1E6));


  65.         // 设置地图的中心点

  66.         mMapController.setCenter(mGeoPoint);

  67.         // 设置地图的缩放级别。 这个值的取值范围是[3,18]。

  68.         mMapController.setZoom(13);


  69.         // 当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。

  70.         // 在地图中显示实时交通信息示

  71.         // mMapView.setTraffic(true);


  72.         // 卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。

  73.         // 显示卫星图,屏掉 mMapView.setTraffic(true);这行代码。

  74.         mMapView.setSatellite(true);


  75.     }


  76.     // 重写以下方法,管理API

  77.     @Override

  78.     protected void onResume() {

  79.         mMapView.onResume();

  80.         if (mBMapManager != null) {

  81.             mBMapManager.start();

  82.         }

  83.         super.onResume();

  84.     }


  85.     @Override

  86.     protected void onPause() {

  87.         mMapView.onPause();

  88.         if (mBMapManager != null) {

  89.             mBMapManager.stop();

  90.         }

  91.         super.onPause();

  92.     }


  93.     @Override

  94.     protected void onDestroy() {

  95.         mMapView.destroy();

  96.         if (mBMapManager != null) {

  97.             mBMapManager.destroy();

  98.             mBMapManager = null;

  99.         }

  100.         super.onDestroy();

  101.     }

  102. }


转载于:https://my.oschina.net/boonya/blog/317233