【百度地图开发之一】申请Key和配置初览显示地图

jerry 地图开发 2015年11月27日 收藏

近段公司项目要实现地图定位相关的功能,而且要求指定使用百度地图,所以花点时间来学习研究一下百度地图的基本使用.今天我先和大家一起来学习申请开发Key和配置显示地图.后续文章中也会继续更新跟进百度地图一系列的文章,也请大家一起关注!

 (一):申请开发Key

       1:在我们使用百度地图之前,首先我们需要去BaiduMapSdK官方网站中申请key(地址为:http://lbsyun.baidu.com/apiconsole/key),看到如下界面点击创建应用,填写应用名称.

          和应用类型(for mobile)

       

       

        

       2:开始配置应用,我们需要配置我们应用的安全码(形式为:输入“安全码”。安全码的组成规则为:Android签名证书的sha1值+“;”+packagename(即:数字签名+分号+包名))安全码的获取方式如下:我们这边使用Eclipse直接查看: winows -> preferance-> android -> build。 如下图示:

     

   3:在之前的步骤中输入安全码,sha1值+我创建的应用的包名,点击确认,这样就配置OK了:截图如下:

      

 

    

   

(二)下面我们进入第二项工作,下载SDK

    我们要使用Baidu地图开发,我们首先要去下载开发sdk库,下载地址:http://developer.baidu.com/map/sdkandev-download.htm注意:为了给用户提供更优质的服务,Android SDK自v2.1.3版本开始采用了全新的Key验证体系。因此,当您选择使用v2.1.3及之后版本的SDK时,需要到新的Key申请页面进行全新Key的申请,申请及配置流程请参考开发指南对应章节 。(选择使用v2.1.2及之前版本SDK的开发者,申请密钥(Key)的方式不变)。

  我这边直接下载全部:

  

 

(三)下面创建项目,来显示初步的显示一下百度地图:

       1.下载上面lib包,创建demo项目把jar和.so文件引入进去如下:

      

       2.自定义Applicaiton,设置全局变量BMapManager,并且进行验证。

     

  1. package com.ztt.baidumap.ui;
  2.  
  3. import android.app.Application;
  4. import android.content.Context;
  5. import android.widget.Toast;
  6. import com.baidu.mapapi.BMapManager;
  7. import com.baidu.mapapi.MKGeneralListener;
  8. import com.baidu.mapapi.map.MKEvent;
  9. /**
  10.  * 自定义Application,进行key识别验证 (使用单例)
  11.  * @author Jiangqq
  12.  * @time 2014/03/15 10:14
  13.  */
  14. public class MyApplication extends Application {
  15.     public static MyApplication instance=null;
  16. BMapManager mBMapManager = null;
  17. public boolean m_bKeyRight = true;
  18.     public static final String strKey = "vUAGbPwLpolIqiwWisnQPeIE";  //百度地图官网申请的密钥
  19. public static MyApplication getInstance(){
  20. return instance;
  21. }
  22. @Override
  23. public void onCreate() {
  24. super.onCreate();
  25. instance=this;
  26. //在APP应用启动的时候,进行初始化验证
  27. initEngineManager(this);
  28. }
  29. /**
  30.  * 进行验证key
  31.  * @param pContext
  32.  */
  33. private void initEngineManager(Context pContext)
  34. {
  35.  if (mBMapManager == null) {
  36.             mBMapManager = new BMapManager(pContext);
  37.         }
  38.  
  39.         if (!mBMapManager.init(strKey,new MyGeneralListener())) {
  40.             Toast.makeText(MyApplication.getInstance(), 
  41.                     "BMapManager  初始化错误!", Toast.LENGTH_LONG).show();
  42.         }
  43. }
  44. // 常用事件监听,用来处理通常的网络错误,授权验证错误等
  45.     static class MyGeneralListener implements MKGeneralListener {
  46.         
  47.         @Override
  48.         public void onGetNetworkState(int iError) {
  49.             if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
  50.                 Toast.makeText(MyApplication.getInstance(), "您的网络出错啦!",
  51.                     Toast.LENGTH_LONG).show();
  52.             }
  53.             else if (iError == MKEvent.ERROR_NETWORK_DATA) {
  54.                 Toast.makeText(MyApplication.getInstance(), "输入正确的检索条件!",
  55.                         Toast.LENGTH_LONG).show();
  56.             }
  57.             // ...
  58.         }
  59.  
  60.         @Override
  61.         public void onGetPermissionState(int iError) {
  62.          //非零值表示key验证未通过
  63.             if (iError != 0) {
  64.                 //授权Key错误:
  65.                 Toast.makeText(MyApplication.getInstance(), 
  66.                         "请在 DemoApplication.java文件输入正确的授权Key,并检查您的网络连接是否正常!error: "+iError, Toast.LENGTH_LONG).show();
  67.                 MyApplication.getInstance().m_bKeyRight = false;
  68.             }
  69.             else{
  70.              MyApplication.getInstance().m_bKeyRight = true;
  71.              Toast.makeText(MyApplication.getInstance(), 
  72.                         "key认证成功", Toast.LENGTH_LONG).show();
  73.             }
  74.         }
  75.     }
  76. }

 2:MainActivity.java实现地图:


    布局文件如下:

   

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.  >
  6.     <com.baidu.mapapi.map.MapView
  7.         android:id="@+id/bmapView"
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="fill_parent"
  10.         android:clickable="true" />
  11.  
  12. </RelativeLayout>

    实现代码:


   

  1. package com.ztt.baidumap.ui;
  2.  
  3. import android.app.Activity;
  4. import android.graphics.Bitmap;
  5. import android.os.Bundle;
  6. import android.widget.Toast;
  7.  
  8. import com.baidu.mapapi.BMapManager;
  9. import com.baidu.mapapi.map.MKMapViewListener;
  10. import com.baidu.mapapi.map.MapController;
  11. import com.baidu.mapapi.map.MapPoi;
  12. import com.baidu.mapapi.map.MapView;
  13. import com.baidu.platform.comapi.basestruct.GeoPoint;
  14.  
  15. /**
  16.  * 进行演示百度地图的基本显示-可以进行创建百度地图和管理,演示百度地图的生命周期
  17.  * @author Jiangqq
  18.  * @time 2014/03/15  10:40
  19.  */
  20. public class MainActivity extends Activity {
  21. /**
  22.  *  MapView 是地图主控件
  23.  */
  24. private MapView mMapView = null;
  25. /**
  26.  *  用MapController完成地图控制 
  27.  */
  28. private MapController mMapController = null;
  29. /**
  30.  *  MKMapViewListener 用于处理地图事件回调
  31.  */
  32. MKMapViewListener mMapListener = null;
  33. @Override
  34. protected void onCreate(Bundle savedInstanceState) {
  35. super.onCreate(savedInstanceState);
  36. /**
  37.          * 使用地图sdk前需先初始化BMapManager.
  38.          * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
  39.          * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
  40.          */
  41.         MyApplication app = (MyApplication)this.getApplication();
  42.         if (app.mBMapManager == null) {
  43.             app.mBMapManager = new BMapManager(getApplicationContext());
  44.             /**
  45.              * 如果BMapManager没有初始化则初始化BMapManager
  46.              */
  47.             app.mBMapManager.init(MyApplication.strKey,new MyApplication.MyGeneralListener());
  48.         }
  49.         /**
  50.           * 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后
  51.           */
  52. setContentView(R.layout.main_layout);
  53.   mMapView = (MapView)findViewById(R.id.bmapView);
  54.         /**
  55.          * 获取地图控制器
  56.          */
  57.         mMapController = mMapView.getController();
  58.         /**
  59.          *  设置地图是否响应点击事件  .
  60.          */
  61.         mMapController.enableClick(true);
  62.         /**
  63.          * 设置地图缩放级别
  64.          */
  65.         mMapController.setZoom(12);
  66.        
  67.         /**
  68.          * 将地图移动至指定点
  69.          * 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标
  70.          * 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口
  71.          */
  72.         double cLat = 39.945;  
  73.         double cLon = 116.404;  
  74.         GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6)); 
  75.         mMapController.setCenter(p);
  76.         
  77.         /**
  78.       *  MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
  79.       */
  80.         mMapListener = new MKMapViewListener() {
  81. @Override
  82. public void onMapMoveFinish() {
  83. /**
  84.  * 在此处理地图移动完成回调
  85.  * 缩放,平移等操作完成后,此回调被触发
  86.  */
  87. }
  88. @Override
  89. public void onClickMapPoi(MapPoi mapPoiInfo) {
  90. /**
  91.  * 在此处理底图poi点击事件
  92.  * 显示底图poi名称并移动至该点
  93.  * 设置过: mMapController.enableClick(true); 时,此回调才能被触发
  94.  * 
  95.  */
  96. String title = "";
  97. if (mapPoiInfo != null){
  98. title = mapPoiInfo.strText;
  99. Toast.makeText(MainActivity.this,title,Toast.LENGTH_SHORT).show();
  100. mMapController.animateTo(mapPoiInfo.geoPt);
  101. }
  102. }
  103.  
  104. @Override
  105. public void onGetCurrentMap(Bitmap b) {
  106. /**
  107.  *  当调用过 mMapView.getCurrentMap()后,此回调会被触发
  108.  *  可在此保存截图至存储设备
  109.  */
  110. }
  111.  
  112. @Override
  113. public void onMapAnimationFinish() {
  114. /**
  115.  *  地图完成带动画的操作(如: animationTo())后,此回调被触发
  116.  */
  117. }
  118.             /**
  119.              * 在此处理地图载完成事件 
  120.              */
  121. @Override
  122. public void onMapLoadFinish() {
  123. Toast.makeText(MainActivity.this, 
  124.        "地图加载完成", 
  125.        Toast.LENGTH_SHORT).show();
  126. }
  127. };
  128. mMapView.regMapViewListener(MyApplication.getInstance().mBMapManager, mMapListener);
  129. }
  130.  @Override
  131.     protected void onPause() {
  132.      /**
  133.       *  MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
  134.       */
  135.         mMapView.onPause();
  136.         super.onPause();
  137.     }
  138.     
  139.     @Override
  140.     protected void onResume() {
  141.      /**
  142.       *  MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
  143.       */
  144.         mMapView.onResume();
  145.         super.onResume();
  146.     }
  147.     
  148.     @Override
  149.     protected void onDestroy() {
  150.      /**
  151.       *  MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
  152.       */
  153.         mMapView.destroy();
  154.         super.onDestroy();
  155.     }
  156.     
  157.     @Override
  158.     protected void onSaveInstanceState(Bundle outState) {
  159.      super.onSaveInstanceState(outState);
  160.      mMapView.onSaveInstanceState(outState);
  161.     
  162.     }
  163.     
  164.     @Override
  165.     protected void onRestoreInstanceState(Bundle savedInstanceState) {
  166.      super.onRestoreInstanceState(savedInstanceState);
  167.      mMapView.onRestoreInstanceState(savedInstanceState);
  168.     }
  169. }

  3:加入权限配置:


   

  1.  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  2.     <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" />
  3.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  4.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  5.     <uses-permission android:name="android.permission.INTERNET" />
  6.     <uses-permission android:name="android.permission.ACCES_MOCK_LOCATION" />
  7.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  8.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
  9.     <uses-permission android:name="android.permission.WAKE_LOCK" />
  10.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  11.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  12.     <uses-permission android:name="android.permission.ACCESS_GPS" />
  13.     <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
  14.     <uses-permission android:name="android.permission.GET_TASKS" />
  15.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  16.     <uses-permission android:name="android.permission.BROADCAST_STICKY" />
  17.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  18.     <!-- 来电消音 -->
  19.     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
  20.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  21.     <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
  22.     <uses-permission android:name="android.permission.RECORD_AUDIO" />

  4: 运行截图:


 

(四):代码中实现百度地图用的几个类简要说明:

       1:MapController:地图引擎管理类:BMapManager据有Application级别的生命周期,BMapManager应在sdk功能模块使用前初始化, 并且在sdk功能模块销毁后销毁.

       2:MapView:一个显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。MapView的创建可以使用在XML布局的方式创建,也可以使用构建函           数创建MapView的生命周期需要与Activity同步,即需要在Activity.onPause中调用onPause(), 在Activity.onResume中调用onResume(),在Activity.onDestroy中调用destory();