初探 Android 百度地图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目录下,拷贝完成后的工程目录如下图所示:
3、在AndroidManifest.xml文件中添加使用权限:
<!-- 使用网络功能所需权限 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" > </uses-permission> <!-- 读取手机的当前状态权限,没有的话会报错,这个是使用百度地图API必须的 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" > </uses-permission> <!--Cache功能需要读写外部存储器 ,若没这个权限,地图加载不出来--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission>
4、添加对多种屏幕的支持:
<!-- 添加屏幕支持 android:anyDensity="true" 这个属性指明应用程序是否包含了能够适用于任何屏幕密度的资源。 对于支持Android1.6(API Level 4)和更高版本的应用程序,这个属性的默认值是true, 并且除非绝对的确认这是应用程序正常工作所必须的,否则不应该把它设置为false。 只是在应用程序直接操作位图时才需要禁止这个属性。 android:largeScreens="true" 这个属性用于指示应用程序是否支持较大外形的屏幕。 一个large类型的屏幕被定义成一个比normal类型的手持设备的屏幕明显还要大的屏幕, 并且为了让应用程序能够良好的使用,使用这个属性时要特别小心,尽管可以依赖系统来调整尺寸, 以便能够填充屏幕。 这个属性的默认值实际上在某些版本之间是不同的,因此最好在任何时候都明确的声明这个属性。 如果设置为false,系统会启用屏幕兼容模式,这时要格外的小心。 android:normalScreens="true" 这个属性用于指示应用程序是否支持普通外形的屏幕。 典型的是HVGA中等密度的屏幕,但是WQVGA低密度和WVGA高密度屏幕也被认为是普通屏幕。 这个属性的默认值是true。 android:smallScreens="true" 这个属性用于指定应用程序是否支持较小外形的屏幕。 一个small类型的屏幕被定义成一个比normal(传统的HVGA)类型的屏幕还要小的屏幕。 外部服务(如Google Play)不会把不支持小屏的应用程序提供给小屏设备, 因为很少有能够确保该应用程序在小屏幕的设备上正常工作的平台。这个属性的默认值是true。 android:resizeable="true" 这个属性用于指示针对不同的屏幕尺寸,应用程序是否可以调整尺寸。默认值是true。 --> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" />
5、配置Activity:
<activity android:configChanges="orientation|keyboardHidden" android:label="@string/app_name" android:name=".BaiduMapBaseActivity" android:screenOrientation="sensor" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
6、在布局xml文件中添加地图控件:
<com.baidu.mapapi.map.MapView android:id="@+id/bmapsView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />
7、 创建地图Activity,并import相关类:
a. 创建地图引擎管理类对象,并初始化。
// 注意:请在调用setContentView前初始化BMapManager对象,否则会报错 mBMapManager = new BMapManager(this.getApplicationContext()); mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() { @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "您的网络出错啦!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } });
b.通过ID获取代表地图显示组件的MapView对象,并设置启用内置的缩放控件。
mMapView = (MapView) this.findViewById(R.id.bmapsView); // 设置启用内置的缩放控件 mMapView.setBuiltInZoomControls(true);
c.获取地图控制器对象,并设置地图的中心点及缩放级别。
// 获取地图控制器,可以用它控制平移和缩放 MapController mMapController = mMapView.getController(); // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) // 北京天安门的经纬度:39.915 * 1E6,116.404 * 1E6 // GeoPoint mGeoPoint = new GeoPoint((int) (39.915 * 1E6), (int) (116.404 * 1E6)); // 上海市浦东新区的GPS纬度经度值:31.224078,121.540419 GeoPoint mGeoPoint = new GeoPoint( (int) (31.224078 * 1E6), (int) (121.540419 * 1E6)); // 设置地图的中心点 mMapController.setCenter(mGeoPoint); // 设置地图的缩放级别。 这个值的取值范围是[3,18]。 mMapController.setZoom(13);
d.重写Activity的生命周期回调方法onResume()、onPause()和onDestroy(),管理地图引擎管理类对象和显示对象生命周期。
@Override protected void onResume() { mMapView.onResume(); if (mBMapManager != null) { mBMapManager.start(); } super.onResume(); } @Override protected void onPause() { mMapView.onPause(); if (mBMapManager != null) { mBMapManager.stop(); } super.onPause(); } @Override protected void onDestroy() { mMapView.destroy(); if (mBMapManager != null) { mBMapManager.destroy(); mBMapManager = null; } super.onDestroy(); }
经过以上这些步骤,加载的是上海市浦东新区地图(基础图),运行工程效果图如下:
注:基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。
e.在地图中显示实时交通信息示图(当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。)
// 在地图中显示实时交通信息示 mMapView.setTraffic(true);
运行效果图如下:
f.显示卫星图(卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。)
// 显示卫星图 mMapView.setSatellite(true);
运行效果图如下:
完整代码如下:
package com.android.baidu.map; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.MKGeneralListener; import com.baidu.mapapi.map.MKEvent; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapView; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * 基本的地图图层,包括若干个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容。 * @author android_ls * */ public class BaiduMapBaseActivity extends Activity { /**地图引擎管理类*/ private BMapManager mBMapManager = null; /**显示地图的View*/ private MapView mMapView = null; /** * 经研究发现在申请KEY时:应用名称一定要写成my_app_应用名(也就是说"my_app_"是必须要有的)。 * 百度地图SDK提供的服务是免费的,接口无使用次数限制。您需先申请密钥(key),才可使用该套SDK。 * */ public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 注意:请在调用setContentView前初始化BMapManager对象,否则会报错 mBMapManager = new BMapManager(this.getApplicationContext()); mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() { @Override public void onGetNetworkState(int iError) { if (iError == MKEvent.ERROR_NETWORK_CONNECT) { Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "您的网络出错啦!", Toast.LENGTH_LONG).show(); } } @Override public void onGetPermissionState(int iError) { if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // 授权Key错误: Toast.makeText(BaiduMapBaseActivity.this.getApplicationContext(), "请在 DemoApplication.java文件输入正确的授权Key!", Toast.LENGTH_LONG).show(); } } }); setContentView(R.layout.main); mMapView = (MapView) this.findViewById(R.id.bmapsView); // 设置启用内置的缩放控件 mMapView.setBuiltInZoomControls(true); // 获取地图控制器,可以用它控制平移和缩放 MapController mMapController = mMapView.getController(); // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) // 北京天安门的经纬度:39.915 * 1E6,116.404 * 1E6 /* GeoPoint mGeoPoint = new GeoPoint( (int) (39.915 * 1E6), (int) (116.404 * 1E6));*/ // 上海市浦东新区的GPS纬度经度值:31.224078,121.540419 GeoPoint mGeoPoint = new GeoPoint( (int) (31.224078 * 1E6), (int) (121.540419 * 1E6)); // 设置地图的中心点 mMapController.setCenter(mGeoPoint); // 设置地图的缩放级别。 这个值的取值范围是[3,18]。 mMapController.setZoom(13); // 当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。 // 在地图中显示实时交通信息示 // mMapView.setTraffic(true); // 卫星地图是卫星拍摄的真实的地理面貌,所以卫星地图可用来检测地面的信息,你可以了解到地理位置,地形等。 // 显示卫星图,屏掉 mMapView.setTraffic(true);这行代码。 mMapView.setSatellite(true); } // 重写以下方法,管理API @Override protected void onResume() { mMapView.onResume(); if (mBMapManager != null) { mBMapManager.start(); } super.onResume(); } @Override protected void onPause() { mMapView.onPause(); if (mBMapManager != null) { mBMapManager.stop(); } super.onPause(); } @Override protected void onDestroy() { mMapView.destroy(); if (mBMapManager != null) { mBMapManager.destroy(); mBMapManager = null; } super.onDestroy(); } }来自:http://blog.csdn.net/android_ls/article/details/8577725