[Android]百度地图使用心得

写在前面的话:最近手机上的各种应用对地图的要求越来越高,人们对地图的依赖也越来越明显,之前零零碎碎的做了些地图先关的功能,一直没有系统的学习过,今天抽空就整理一下。

 

使用百度地图的步骤:

1、去百度地图API官网(http://developer.baidu.com/map/sdkandev-download.htm)下载jar包和库文件(我使用的是Android SDKv2.1.3和locSDK_3.3);

2、申请自己的秘钥(自Android SDKv2.1.3之后,申请秘钥的方式有所改变);

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>
    <!-- SDK离线地图和cache功能需要读写外部存储器 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
    </uses-permission>
    <!-- 获取设置信息和详情页直接拨打电话需要以下权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" >
    </uses-permission>
    <uses-permission android:name="android.permission.CALL_PHONE" >
    </uses-permission>
    <!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
    </uses-permission>

    <permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </permission>

    <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
    </uses-permission>
    <uses-permission android:name="android.permission.ACCESS_GPS" />
View Code

在Application下添加服务:

<service
            android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote" >
</service>
View Code

4、在Acitivity的onCreate()方法中引用我们申请的key,初始化百度地图;

mMapManager = new BMapManager(getApplication());
        mMapManager.init("你的key", null);
        setContentView(R.layout.activity_map);
View Code

5、在布局文件中导入地图视图;

<com.baidu.mapapi.map.MapView
        android:id="@+id/baiduMap"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
View Code

6、在Activity中初始化地图,并根据自己的需要个性化;

mMapView = (MapView) this.findViewById(R.id.baiduMap);
        // 启用缩放控件
        mMapView.setBuiltInZoomControls(true);

        // 得到MapView的控制权,可以用它控制和驱动平移和缩放
        controller = mMapView.getController();
        // 用给定的经纬度构造一个GeoPoint,单位是微度(度*1E6)
        // GeoPoint point = new GeoPoint((int) (31.223872 * 1E6),
        // (int) (121.538746 * 1E6));

        // controller.setCenter(point);
        controller.setZoom(14);
        controller.enableClick(true);
View Code

7、初始化定位相关类(定位必须和其监听类一起使用,否则无法定位);

/* 2、定位 获取坐标 */

        // 定位初始化
        mLocation = new LocationClient(this);
        mLocation.registerLocationListener(mLocationListener);

        // 定位的选项
        LocationClientOption option = new LocationClientOption();
        option.setProdName("你的应用名称");
        // 优先网络定位
        option.setPriority(LocationClientOption.NetWorkFirst);
                // 百度地图的坐标形式
        option.setCoorType("bd09ll");
                // 每10秒 更新一次
        option.setScanSpan(10 * 1000);
        mLocation.setLocOption(option);
        mLocation.start();
View Code

监听类:

/**
     * 定位监类,定位时需要调用
     **/
    class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            if (mLocation == null) {
                return;
            } else {
                mData.longitude = location.getLongitude();
                mData.latitude = location.getLatitude();
                mData.accuracy = location.getRadius();
                mData.direction = location.getDerect();

                System.out.println(mData.longitude + "," + mData.latitude);
                mLocationOverlay.setData(mData);
                mMapView.refresh();

                // 定位时移到定位点
                if (manualRequest) {
                    controller.animateTo(new GeoPoint((int)(mData.latitude* 1e6), (int)(mData.longitude *  1e6)));
                    manualRequest = false;
                }
            }
        }
View Code

8、将定位坐标绑定在定位图层;

/* 3、将坐标绑定在定位图层上 */

        // 初始化定位图层
        mLocationOverlay = new LocationOverlay(mMapView);
        mData = new LocationData();
        mData.latitude = 31.223829;
        mData.longitude = 121.538746;
        mLocationOverlay.setData(mData);

        // 在地图上添加,定位图层
        mMapView.getOverlays().add(mLocationOverlay);
        mLocationOverlay.enableCompass();

        mMapView.refresh();
View Code

基本步骤就是这些,步骤可能显得比较多,我是尽量拆分开来,容易记忆便于理解。

 

值的说明的是:

1、百度地图和定位是分开的jar包和库文件,需要分别下载;

2、定位必须要和监听类一起使用;    

3、百度地图API和定位API现在是分开独立的,但是百度地图中提供定位图层,若要显示定位信息,必须引用次图层。

 

下面是Acitivity的完整代码:

  1 package cn.newtouch.map;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.view.View;
  6 import android.view.View.OnClickListener;
  7 import android.widget.Button;
  8 import android.widget.Toast;
  9 
 10 import com.baidu.location.BDLocation;
 11 import com.baidu.location.BDLocationListener;
 12 import com.baidu.location.LocationClient;
 13 import com.baidu.location.LocationClientOption;
 14 import com.baidu.mapapi.BMapManager;
 15 import com.baidu.mapapi.map.LocationData;
 16 import com.baidu.mapapi.map.MapController;
 17 import com.baidu.mapapi.map.MapView;
 18 import com.baidu.mapapi.map.MyLocationOverlay;
 19 import com.baidu.platform.comapi.basestruct.GeoPoint;
 20 
 21 public class MapActivity extends Activity {
 22     // 地图相关
 23     private BMapManager mMapManager = null;
 24     private MapView mMapView = null;
 25     private MapController controller = null;
 26     // 定位相关
 27     private LocationClient mLocation = null;
 28     private LocationData mData = null;
 29     // 定位图层
 30     private LocationOverlay mLocationOverlay = null;
 31     public MyLocationListener mLocationListener = new MyLocationListener();
 32 
 33     // 手动定位请求
 34     private boolean manualRequest = false;
 35 
 36     // 手动定位按钮
 37     private static Button locationBtn = null;
 38 
 39     @Override
 40     protected void onCreate(Bundle savedInstanceState) {
 41         super.onCreate(savedInstanceState);
 42         /* 1、绑定地图 */
 43         mMapManager = new BMapManager(getApplication());
 44         mMapManager.init("你的key", null);
 45         setContentView(R.layout.activity_map);
 46 
 47         mMapView = (MapView) this.findViewById(R.id.baiduMap);
 48         // 启用缩放控件
 49         mMapView.setBuiltInZoomControls(true);
 50 
 51         // 得到MapView的控制权,可以用它控制和驱动平移和缩放
 52         controller = mMapView.getController();
 53         // 用给定的经纬度构造一个GeoPoint,单位是微度(度*1E6)
 54         // GeoPoint point = new GeoPoint((int) (31.223872 * 1E6),
 55         // (int) (121.538746 * 1E6));
 56 
 57         // controller.setCenter(point);
 58         controller.setZoom(14);
 59         controller.enableClick(true);
 60 
 61         /* 2、定位 获取坐标 */
 62 
 63         // 定位初始化
 64         mLocation = new LocationClient(this);
 65         mLocation.registerLocationListener(mLocationListener);
 66 
 67         // 定位的选项
 68         LocationClientOption option = new LocationClientOption();
 69         option.setProdName("你的应用名称");
 70         // 优先网络定位
 71         option.setPriority(LocationClientOption.NetWorkFirst);
 72         option.setCoorType("bd09ll");
 73         option.setScanSpan(10 * 1000);
 74         mLocation.setLocOption(option);
 75         mLocation.start();
 76 
 77         /* 3、将坐标绑定在定位图层上 */
 78 
 79         // 初始化定位图层
 80         mLocationOverlay = new LocationOverlay(mMapView);
 81         mData = new LocationData();
 82         mData.latitude = 31.223829;
 83         mData.longitude = 121.538746;
 84         mLocationOverlay.setData(mData);
 85 
 86         // 在地图上添加,定位图层
 87         mMapView.getOverlays().add(mLocationOverlay);
 88         mLocationOverlay.enableCompass();
 89 
 90         mMapView.refresh();
 91 
 92         locationBtn = (Button) this.findViewById(R.id.locationBtn);
 93         locationBtn.setOnClickListener(new OnClickListener() {
 94             @Override
 95             public void onClick(View v) {
 96                 locationNow();
 97             }
 98 
 99         });
100     }
101 
102     @Override
103     protected void onDestroy() {
104         mMapView.destroy();
105         if (mMapManager != null) {
106             mMapManager.destroy();
107             mMapManager = null;
108         }
109         super.onDestroy();
110     }
111 
112     @Override
113     protected void onPause() {
114         mMapView.onPause();
115         if (mMapManager != null) {
116             mMapManager.stop();
117         }
118         super.onPause();
119     }
120 
121     @Override
122     protected void onResume() {
123         mMapView.onResume();
124         if (mMapManager != null) {
125             mMapManager.start();
126         }
127         super.onResume();
128     }
129 
130     /**
131      * 手动定位请求
132      **/
133     private void locationNow() {
134         manualRequest = true;
135         mLocation.requestLocation();
136         System.out.println("---- " + mLocation.requestLocation());
137         Toast.makeText(this, "locating ...", Toast.LENGTH_SHORT).show();
138     }
139 
140     /**
141      * 定位监类,定位时需要调用
142      **/
143     class MyLocationListener implements BDLocationListener {
144         @Override
145         public void onReceiveLocation(BDLocation location) {
146             if (mLocation == null) {
147                 return;
148             } else {
149                 mData.longitude = location.getLongitude();
150                 mData.latitude = location.getLatitude();
151                 mData.accuracy = location.getRadius();
152                 mData.direction = location.getDerect();
153 
154                 System.out.println(mData.longitude + "," + mData.latitude);
155                 mLocationOverlay.setData(mData);
156                 mMapView.refresh();
157 
158                 // 定位时移到定位点
159                 if (manualRequest) {
160                     controller.animateTo(new GeoPoint((int)(mData.latitude* 1e6), (int)(mData.longitude *  1e6)));
161                     manualRequest = false;
162                 }
163             }
164         }
165 
166         @Override
167         public void onReceivePoi(BDLocation arg0) {
168 
169         }
170     }
171 
172     /**
173      * 定义定位图层
174      **/
175     class LocationOverlay extends MyLocationOverlay {
176 
177         public LocationOverlay(MapView mapView) {
178             super(mapView);
179         }
180 
181         // 重写点击事件
182         @Override
183         protected boolean dispatchTap() {
184             Toast.makeText(MapActivity.this, "I've touch the map lay",
185                     Toast.LENGTH_SHORT).show();
186             return true;
187         }
188 
189     }
190 
191 }
View Code

 

 

 
 
 
posted @ 2013-08-12 18:00  _Felix  阅读(716)  评论(0)    收藏  举报