大过年的,没回家。听着外面烟花爆竹声阵阵,大冷天的一个人也不想出去转。城市不管多么繁华,一个人都是感觉“无味”。最近在研究百度地图的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目录下,拷贝完成后的工程目录如下图所示:

Android百度地图——SDK版本v2.0.0初探_第1张图片

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();    }

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

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

Android百度地图——SDK版本v2.0.0初探_第2张图片

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

      // 在地图中显示实时交通信息示       mMapView.setTraffic(true);

运行效果图如下:

Android百度地图——SDK版本v2.0.0初探_第3张图片

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

 // 显示卫星图 mMapView.setSatellite(true);

运行效果图如下:

Android百度地图——SDK版本v2.0.0初探_第4张图片
完整代码如下:

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();    }}

更多相关文章

  1. Android录制屏幕的实现方法
  2. 给android增加屏幕校准
  3. Lumia920和930对比哪个好?诺基亚Lumia920与930屏幕/性能全面对比
  4. 保持Android手机屏幕长亮
  5. 推荐Android两种屏幕适配方案
  6. Android Intent应用,打开网页,安装程序,打电话,打开地图等功能
  7. android等比例缩放图片
  8. 最新百度地图android sdk自定义覆盖物

随机推荐

  1. Android在非UI线程中显示Toast
  2. Android手机屏幕px转dp和dp转px工具类
  3. 1、搭建android开发环境
  4. NFS挂载android文件系统
  5. Android系统启动过程
  6. android hal学习——aidl,java service,jni
  7. Activity 本身调用finish() 然后显示之前
  8. android中通过looper+handler方式在子线
  9. android 使用Intent传递对象 Serializabl
  10. Android动画类型