【百度地图开发之二】基于Fragment的地图框架的使用

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

上一篇我们学习了百度地图最基础的内容(申请Key和配置初览显示地图),今天继续来看一下基于Fragment的地图框架的使用。

(一)基本介绍(Fragment和SupportMapFragment):

      Fragment的使用现在安卓APP开发中用的比较多了,Fragment名称为碎片和Activity有着相似的生命管理周期,基本作用可以进行开发兼容手机和平板的app,较少兼容分辨率版本的工作量,提高工作效率。其中Fragment还是可以包含控制代码的视图模块,可以非常方便的进行组合。使用起来很方便。具体有个Fragment的介绍和使用请点击查看(官网Fragment的介绍和基本使用),这边就不多讲了。下面我们来看下百度地图API给我们提供的地图框架SupportMapFragment。SupportMapFragment是继承于Fragment因此具备Fragment的完成的生命周期,该框架主要用来管理地图生命周期,主要有下面两个方法1:getMapView():获取MapView引用,要在onCreateView函数调用之后进行使用.2:newInstance();返回获取SupportMapFragment对象实例。


(二)使用方法: 

     使用方法和我们平时用Fragment的时候差不多,首先获取SupportMapFragment实例,然后把该Fragment添加到指定View视图图.commit一下即可.

(三)代码演示,注释基本已经写了挺详细了,直接看就OK了

     1.自定义MyApplication.java设置全局变量,并且进行校验密钥:

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


     2:创建一个FragmentMapDemo.java,继承于FragmentActivity,使用newInstance()方法获取SupportMapFragment,进行显示地图:


  

  1. package com.ztt.baidumap.ui;
  2.  
  3. import android.content.res.Configuration;
  4. import android.os.Bundle;
  5. import android.support.v4.app.FragmentActivity;
  6. import android.support.v4.app.FragmentManager;
  7. import android.support.v4.app.FragmentTransaction;
  8. import android.util.Log;
  9.  
  10. import com.baidu.mapapi.BMapManager;
  11. import com.baidu.mapapi.map.MapController;
  12. import com.baidu.mapapi.map.SupportMapFragment;
  13. import com.baidu.platform.comapi.basestruct.GeoPoint;
  14.  
  15. public class FragmentMapDemo extends FragmentActivity {
  16. SupportMapFragment map;
  17. @Override
  18. public void onCreate(Bundle arg0) {
  19. /**
  20.          * 使用地图sdk前需先初始化BMapManager.
  21.          * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
  22.          * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
  23.          */
  24.         MyApplication app = (MyApplication)this.getApplication();
  25.         if (app.mBMapManager == null) {
  26.             app.mBMapManager = new BMapManager(getApplicationContext());
  27.             /**
  28.              * 如果BMapManager没有初始化则初始化BMapManager
  29.              */
  30.             app.mBMapManager.init(MyApplication.strKey,new MyApplication.MyGeneralListener());
  31.         }
  32. Log.d("zttjiangqq", "onCreate");
  33. setContentView(R.layout.activity_fragment);
  34. map = SupportMapFragment.newInstance();
  35. FragmentManager manager = getSupportFragmentManager();
  36. FragmentTransaction ft= manager.beginTransaction();
  37. ft.add(R.id.map, map, "map_fragment");
  38. ft.commit();
  39. }
  40. @Override
  41. protected void onRestoreInstanceState(Bundle savedInstanceState) {
  42. super.onRestoreInstanceState(savedInstanceState);
  43. Log.d("zttjiangqq", "onRestoreInstanceState");
  44. }
  45.  
  46. @Override
  47. protected void onRestart() {
  48. super.onRestart();
  49. Log.d("zttjiangqq", "onRestart");
  50. }
  51.  
  52. @Override
  53. public void onStart() {
  54. super.onStart();
  55. Log.d("zttjiangqq", "onStart");
  56. }
  57.  
  58. @Override
  59. public void onResume() {
  60. super.onResume();
  61. Log.d("zttjiangqq", "onResume");
  62. // 得到MapView的控制权,可以用它控制和驱动平移和缩放  
  63. MapController controller = map.getMapView().getController();
  64. // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)  并且设置设置地图中心点   (这边使用天安门)
  65. controller.setCenter(new GeoPoint((int)(39.945 * 1E6), (int)(116.404 * 1E6)));
  66. // 设置地图zoom级别  
  67. controller.setZoom(13);
  68. }
  69.  
  70. @Override
  71. public void onSaveInstanceState(Bundle outState) {
  72. super.onSaveInstanceState(outState);
  73. Log.d("zttjiangqq", "onSaveInstanceState");
  74. }
  75.  
  76. @Override
  77. public void onPause() {
  78. super.onPause();
  79. Log.d("zttjiangqq", "onPause");
  80. }
  81.  
  82. @Override
  83. public void onStop() {
  84. super.onStop();
  85. Log.d("zttjiangqq", "onStop");
  86. }
  87.  
  88. @Override
  89. public void onDestroy() {
  90. super.onDestroy();
  91. Log.d("zttjiangqq", "onDestory");
  92. }
  93.  
  94. @Override
  95. public void onConfigurationChanged(Configuration newConfig) {
  96. super.onConfigurationChanged(newConfig);
  97. Log.d("zttjiangqq", "onConfigurationChanged");
  98. }
  99. }

  3:布局文件:


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >
  6.  
  7.     <FrameLayout
  8.         android:id="@+id/map"
  9.         android:layout_width="match_parent"
  10.         android:layout_height="match_parent" />
  11.  
  12. </LinearLayout>



(三)注意一定要添加配置权限

 

  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" />