百度地图3.0初用笔记(一)


百度地图3.0初用笔记(一)

分类: Android


  入门新手,记于此以为笔记。代码几乎与百度示例一致,仅增加了一个地图缩放处理,并说明了isStarted的null检查问题。定位效果图如下:

                                                          定位效果图

  使用 baidumapapi_v3_0_0.jar 和 locSDK_4.1.jar 进行地图定位。布局比较简单,直接使用了一个百度地图的MapView组件,布局文件如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  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.     <com.baidu.mapapi.map.MapView  
  8.         android:id="@+id/bmapView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:clickable="true" />  
  12.   
  13. </LinearLayout>  

  使用百度定位和百度地图都需要一些权限,其中有些是重复的,分别列出如下:

  百度定位所需权限:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <!-- 这个权限用于进行网络定位 -->  
  2. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />  
  3. <!-- 这个权限用于访问GPS定位 -->  
  4. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
  5. <!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->  
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  7. <!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->  
  8. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  9. <!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->  
  10. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  11. <!-- 用于读取手机当前的状态 -->  
  12. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  13. <!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据 -->  
  14. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  15. <!-- 访问网络,网络定位需要上网 -->  
  16. <uses-permission android:name="android.permission.INTERNET" />  
  17. <!-- SD卡读取权限,用户写入离线定位数据 -->  
  18. <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  
  19. <!-- 允许应用读取低级别的系统日志文件 -->  
  20. <uses-permission android:name="android.permission.READ_LOGS" />  

  使用百度地图所需权限:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
  2. <uses-permission android:name="android.permission.USE_CREDENTIALS" />  
  3. <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />  
  4. <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />  
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  6. <uses-permission android:name="android.permission.INTERNET" />  
  7. <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
  8. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  9. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  10. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  12. <uses-permission android:name="android.permission.BROADCAST_STICKY" />  
  13. <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
  14. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  

  新版本的百度地图使用时还需要一个KEY密钥,这可以免费申请,然后需要在 AndroidManifest.xml文件中的Application标签中加入Key配置:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <meta-data  
  2.     android:name="com.baidu.lbsapi.API_KEY"  
  3.     android:value="你申请的Key密钥" />  

  对应定位来说,还需要在Application标签中配置一个service属性:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <service  
  2.     android:name="com.baidu.location.f"  
  3.     android:enabled="true"  
  4.     android:process=":remote" />  

 

 在使用SDK的各组件之前需调用SDKInitializer类的静态初始化函数进行全局初始化,这里在OnCreate的setContentView之前调用,因为布局中用到了MapView组件。

  MapView组件有三个控制函数:onDestroy()、onPause()、onResume() 用于使销毁、暂停和唤醒百度地图,需要在Activity的相应的函数中调用它们,以更好地管理地图的生命周期。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.     @Override  
  2.     protected void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext    
  5.         //注意该方法要再setContentView方法之前实现    
  6.         SDKInitializer.initialize(getApplicationContext());  
  7.         setContentView(R.layout.activity_main);  
  8.     }  
  9.       
  10.     @Override  
  11.     protected void onDestroy() {  
  12.         super.onDestroy();  
  13. <span style="white-space:pre">        </span>// 如果开启了定位层的显示,则在销毁前关闭它  
  14. <span style="white-space:pre">        mBaiduMap.setMyLocationEnabled(false); </span>  
  15.         // 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
  16.         mMapView.onDestroy();  
  17.     }  
  18.   
  19.     @Override  
  20.     protected void onResume() {  
  21.         super.onResume();  
  22.         // 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
  23.         mMapView.onResume();  
  24.     }  
  25.   
  26.     @Override  
  27.     protected void onPause() {  
  28.         super.onPause();  
  29.         // 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
  30.         mMapView.onPause();  
  31.     }  

  在定位显示时,需要开启地图的定位图层,可通过地图控制器的 setMyLocationEnabled 方法来设置,地图的控制器对象BaiduMap 可由 MapView 的 getMap() 方法获取。需注意的是,在上面的 onDestroy()方法中,进行了定位层关闭的设置,否则,在后面的实时显示定位信息的showLocation函数中的 BaiduMap对象的 setMyLocationData方法调用会出现错误。

  进行定位需要一个 LocationClient 对象,然后用该对象的 registerLocationListener 方法注册一个监听器、设置定位选项,并开启定位。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // 获取地图组件引用及地图控制器  
  2. mMapView = (MapView) findViewById(R.id.bmapView);  
  3. mBaiduMap = mMapView.getMap();  
  4.   
  5. // 开启定位图层  
  6. mBaiduMap.setMyLocationEnabled(true);  
  7.   
  8. mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类  
  9. mLocationClient.registerLocationListener(myListener); // 注册监听器  
  10.   
  11. // 设置定位选项  
  12. LocationClientOption option = new LocationClientOption();  
  13. // option.disableCache(true); // 是否允许缓存  
  14. option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式  
  15. option.setOpenGps(true); // 开启GPS  
  16. option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02  
  17. option.setScanSpan(2000);// 设置发起定位请求的间隔时间为2000ms  
  18. option.setIsNeedAddress(true);// 返回的定位结果包含地址信息  
  19. option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向  
  20. mLocationClient.setLocOption(option);  
  21. mLocationClient.start(); // 启动定位  

  其中 myListener 的声明为:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. BDLocationListener myListener = new MyLocationListener();  
  MyLocationListener 是一个实现了 BDLocationListener 接口的自定义类,当经纬度改变时,它能接收到新的位置信息,经处理后便可在地图上显示其位置:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public class MyLocationListener implements BDLocationListener {  
  2.     @Override  
  3.     public void onReceiveLocation(BDLocation location) {  
  4.         if (location == null)  
  5.             return;  
  6.         showLocation(location);  
  7.     }  
  8.   
  9.     public void onReceivePoi(BDLocation poiLocation) {  
  10.         // 将在下个版本中去除poi功能  
  11.         if (poiLocation == null) {  
  12.             return;  
  13.         }  
  14.     }  
  15. }  

  在showLocation 函数中进行数据数据处理,然后在地图中标出当前位置:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public void showLocation(BDLocation location) {  
  2.     // 构造定位数据  
  3.     MyLocationData locData = new MyLocationData.Builder()  
  4.             .accuracy(location.getRadius())  
  5.             // 此处设置开发者获取到的方向信息,顺时针0-360  
  6.             .direction(location.getDirection()).latitude(location.getLatitude())  
  7.             .longitude(location.getLongitude()).build();  
  8.     // 设置定位数据  
  9.     mBaiduMap.setMyLocationData(locData);  
  10.   
  11.     // 缩放设置  
  12.     if (isFirstLoc) {  
  13.         isFirstLoc = false;  
  14.         // 设置地图缩放比例:17级100米  
  15.         MapStatusUpdate ms = MapStatusUpdateFactory.zoomTo(17);   
  16.         mBaiduMap.setMapStatus(ms);  
  17.     }  
  18.     // 更新地图位置  
  19.     LatLng ll = new LatLng(location.getLatitude(),  
  20.             location.getLongitude());  
  21.     MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);  
  22.     mBaiduMap.animateMapStatus(u);  
  23. }  

  仅在第一次定位后设置地图的显示比例,将其放大到100米级别。最后的“更新地图位置”部分放到了if 条件之外,这样在每次定位后或在地图移到其它地方后,都会将新的定位后的位置显示在屏幕中。

  实际上定位层的显示有一个相应的模式,默认的模式为 NORMAL,这种模式下地图不会根据定位信息进行更新,因此在本例中使用了手动更新方式,即取得经纬度后用animateMapStatus 方法来改变地图的状态,以达到实时更新定位层的目的。在(二)中将说明定位层的显示方式。

  

  在百度定位开发的介绍示例中有一个定位端启动的判断:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. mLocationClient.setLocOption(option);  
  2. mLocationClient.start();  
  3. if (mLocationClient != null && mLocationClient.isStarted())  
  4.     mLocationClient.requestLocation();  
  5. else  
  6.     Log.d("LocSDK4""locationClient is null or not started");  

  这仅是在启动后手动地调用一个定位请求,但这是可省略的。实际上 isStarted函数的返回几乎都为 null ,但这并不影响后续的定位,因为启动需要时间,而此处的检查显然是太紧急了的。根据论坛里说是因为这些示例更新尚未完善,因此不必纠结于此处的 null 问题。


  另外,所声明的变量有:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. MapView mMapView = null;  
  2. BaiduMap mBaiduMap = null;  
  3. public LocationClient mLocationClient = null;  
  4. public BDLocationListener myListener = new MyLocationListener();  
  5. Boolean isFirstLoc = true;  

  记录完毕。






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值