转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37730469

在上一篇博客中,我们成功把地图导入了我们的项目。本篇我们准备为地图添加:第一,定位功能;第二,与方向传感器结合,通过旋转手机进行道路的方向确认。有了这两个功能,地图已经可以为我服务了~~~~

效果图:

好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中。

1、初次启动定位
[java] view plaincopy
  1. /**
  2. * 定位的客户端
  3. */
  4. private LocationClient mLocationClient;
  5. /**
  6. * 定位的监听器
  7. */
  8. public MyLocationListener mMyLocationListener;
  9. /**
  10. * 当前定位的模式
  11. */
  12. private LocationMode mCurrentMode = LocationMode.NORMAL;
  13. /***
  14. * 是否是第一次定位
  15. */
  16. private volatile boolean isFristLocation = true;
  17. /**
  18. * 初始化定位相关代码
  19. */
  20. private void initMyLocation()
  21. {
  22. // 定位初始化
  23. mLocationClient = new LocationClient(this);
  24. mMyLocationListener = new MyLocationListener();
  25. mLocationClient.registerLocationListener(mMyLocationListener);
  26. // 设置定位的相关配置
  27. LocationClientOption option = new LocationClientOption();
  28. option.setOpenGps(true);// 打开gps
  29. option.setCoorType("bd09ll"); // 设置坐标类型
  30. option.setScanSpan(1000);
  31. mLocationClient.setLocOption(option);
  32. }

然后是定位的监听器MyLocationListener:

[java] view plaincopy
  1. /**
  2. * 实现实位回调监听
  3. */
  4. public class MyLocationListener implements BDLocationListener
  5. {
  6. @Override
  7. public void onReceiveLocation(BDLocation location)
  8. {
  9. // map view 销毁后不在处理新接收的位置
  10. if (location == null || mMapView == null)
  11. return;
  12. // 构造定位数据
  13. MyLocationData locData = new MyLocationData.Builder()
  14. .accuracy(location.getRadius())
  15. // 此处设置开发者获取到的方向信息,顺时针0-360
  16. .direction(mXDirection).latitude(location.getLatitude())
  17. .longitude(location.getLongitude()).build();
  18. mCurrentAccracy = location.getRadius();
  19. // 设置定位数据
  20. mBaiduMap.setMyLocationData(locData);
  21. mCurrentLantitude = location.getLatitude();
  22. mCurrentLongitude = location.getLongitude();
  23. // 设置自定义图标
  24. BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
  25. .fromResource(R.drawable.navi_map_gps_locked);
  26. MyLocationConfigeration config = new MyLocationConfigeration(
  27. mCurrentMode, true, mCurrentMarker);
  28. mBaiduMap.setMyLocationConfigeration(config);
  29. // 第一次定位时,将地图位置移动到当前位置
  30. if (isFristLocation)
  31. {
  32. isFristLocation = false;
  33. LatLng ll = new LatLng(location.getLatitude(),
  34. location.getLongitude());
  35. MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
  36. mBaiduMap.animateMapStatus(u);
  37. }
  38. }
  39. }

可以看到,我们初始化了定位的参数,设置了定位的监听器,每隔1s会进行一次定位,应用打开时,第一定位,会把地图中心设置当前用户位置。
定位也是比较耗电的,所以我们在onStart中开启定位,在onStop中关闭定位~~这样应用最小化时就不会一直在哪GPS请求定位了,用户要是看你app一直在那定位,估计马上就被卸载了~

[java] view plaincopy
  1. @Override
  2. protected void onStart()
  3. {
  4. // 开启图层定位
  5. mBaiduMap.setMyLocationEnabled(true);
  6. if (!mLocationClient.isStarted())
  7. {
  8. mLocationClient.start();
  9. }
  10. // 开启方向传感器
  11. myOrientationListener.start();
  12. super.onStart();
  13. }
  14. @Override
  15. protected void onStop()
  16. {
  17. // 关闭图层定位
  18. mBaiduMap.setMyLocationEnabled(false);
  19. mLocationClient.stop();
  20. // 关闭方向传感器
  21. myOrientationListener.stop();
  22. super.onStop();
  23. }

上面的传感器的代码,一会就会介绍~

记得在AndroidManifest.xml配一个service

[html] view plaincopy
  1. <service
  2. android:name="com.baidu.location.f"
  3. android:enabled="true"
  4. android:process=":remote" >
  5. <intent-filter>
  6. <action android:name="com.baidu.location.service_v2.2" >
  7. </action>
  8. </intent-filter>
  9. </service>

现在基本的定位功能已经实现了~不过我们还需要添加点击定位按钮和方向传感器

2、我的位置

点击我的位置菜单会调用center2myLoc方法。

[java] view plaincopy
  1. case R.id.id_menu_map_myLoc:
  2. center2myLoc();
  3. break;
[java] view plaincopy
  1. /**
  2. * 地图移动到我的位置,此处可以重新发定位请求,然后定位;
  3. * 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好
  4. */
  5. private void center2myLoc()
  6. {
  7. LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);
  8. MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
  9. mBaiduMap.animateMapStatus(u);
  10. }

很简单,我们在定位的监听器中已经保存了最近一次的定位经纬度,所以只需要点击时,把地图移动到相应的位置即可。

3、集成方向传感器

首先是封装的方向传感器的类MyOrientationListener.java

[java] view plaincopy
  1. package com.zhy.zhy_baidu_ditu_demo00;
  2. import android.content.Context;
  3. import android.hardware.Sensor;
  4. import android.hardware.SensorEvent;
  5. import android.hardware.SensorEventListener;
  6. import android.hardware.SensorManager;
  7. public class MyOrientationListener implements SensorEventListener
  8. {
  9. private Context context;
  10. private SensorManager sensorManager;
  11. private Sensor sensor;
  12. private float lastX ;
  13. private OnOrientationListener onOrientationListener ;
  14. public MyOrientationListener(Context context)
  15. {
  16. this.context = context;
  17. }
  18. // 开始
  19. public void start()
  20. {
  21. // 获得传感器管理器
  22. sensorManager = (SensorManager) context
  23. .getSystemService(Context.SENSOR_SERVICE);
  24. if (sensorManager != null)
  25. {
  26. // 获得方向传感器
  27. sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
  28. }
  29. // 注册
  30. if (sensor != null)
  31. {//SensorManager.SENSOR_DELAY_UI
  32. sensorManager.registerListener(this, sensor,
  33. SensorManager.SENSOR_DELAY_UI);
  34. }
  35. }
  36. // 停止检测
  37. public void stop()
  38. {
  39. sensorManager.unregisterListener(this);
  40. }
  41. @Override
  42. public void onAccuracyChanged(Sensor sensor, int accuracy)
  43. {
  44. }
  45. @Override
  46. public void onSensorChanged(SensorEvent event)
  47. {
  48. // 接受方向感应器的类型
  49. if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
  50. {
  51. // 这里我们可以得到数据,然后根据需要来处理
  52. float x = event.values[SensorManager.DATA_X];
  53. if( Math.abs(x- lastX) > 1.0 )
  54. {
  55. onOrientationListener.onOrientationChanged(x);
  56. }
  57. //            Log.e("DATA_X", x+"");
  58. lastX = x ;
  59. }
  60. }
  61. public void setOnOrientationListener(OnOrientationListener onOrientationListener)
  62. {
  63. this.onOrientationListener = onOrientationListener ;
  64. }
  65. public interface OnOrientationListener
  66. {
  67. void onOrientationChanged(float x);
  68. }
  69. }

在onCreate中初始化方向传感器

[java] view plaincopy
  1. /**
  2. * 初始化方向传感器
  3. */
  4. private void initOritationListener()
  5. {
  6. myOrientationListener = new MyOrientationListener(
  7. getApplicationContext());
  8. myOrientationListener
  9. .setOnOrientationListener(new OnOrientationListener()
  10. {
  11. @Override
  12. public void onOrientationChanged(float x)
  13. {
  14. mXDirection = (int) x;
  15. // 构造定位数据
  16. MyLocationData locData = new MyLocationData.Builder()
  17. .accuracy(mCurrentAccracy)
  18. // 此处设置开发者获取到的方向信息,顺时针0-360
  19. .direction(mXDirection)
  20. .latitude(mCurrentLantitude)
  21. .longitude(mCurrentLongitude).build();
  22. // 设置定位数据
  23. mBaiduMap.setMyLocationData(locData);
  24. // 设置自定义图标
  25. BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
  26. .fromResource(R.drawable.navi_map_gps_locked);
  27. MyLocationConfigeration config = new MyLocationConfigeration(
  28. mCurrentMode, true, mCurrentMarker);
  29. mBaiduMap.setMyLocationConfigeration(config);
  30. }
  31. });
  32. }

最后在onStart和onStop中分别开启和关闭方向传感器。

对于旋转手机确定方向,实际上利用了

[java] view plaincopy
  1. new MyLocationData.Builder()
  2. //此处设置开发者获取到的方向信息,顺时针0-360                                                                                                .direction(mXDirection)

只需要把x方向的角度设置即可~~~是不是很简单~~~

好了,介绍完毕了,关闭地图样式的切换,以及跟随、罗盘等模式的切换就不介绍了,大家自己看下源码~~

源码点击下载
注:开发者key需要换成自己申请的,不清楚申请的请看第一篇博客的。

Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器相关推荐

  1. Android --- 百度地图 SDK v3.6.0 以上版本找不到 PoiOverlay 类

    解决方法: 下载下面的包,解压 链接:https://pan.baidu.com/s/1Wux0Y8-ZygYL5v0gRanVqw 提取码:ccxx 将下面的文件放到你的项目中

  2. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...

  3. Android 百度地图 SDK v3.0.0 (一)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SD ...

  4. Android百度地图——SDK版本v2.0.0初探

    大过年的,没回家.听着外面烟花爆竹声阵阵,大冷天的一个人也不想出去转.城市不管多么繁华,一个人都是感觉"无味".最近在研究百度地图的API使用,在使用过程中遇到些问题,有些心得吧, ...

  5. android 百度周边雷达,android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch

    因为项目需要,最近研究了下百度地图的SDK,简单记录一些点. 准备工作 1.下载SDK及demo 2.申请key key需要用到app的包名和签名证书的SHA1值 如果需要使用 周边雷达 功能,需要再 ...

  6. android 百度地图SDK 3.7.0 周边雷达-Radar 周边搜索-PoiSearch

    因为项目需要,最近研究了下百度地图的SDK,简单记录一些点. 准备工作 1.下载SDK及demo 下载地址:http://lbsyun.baidu.com/index.php?title=androi ...

  7. 百度地图SDK v3.6.0以上版本找不到PoiOverlay类的解决方法

    最近测试本人使用的是百度地图用SDK v3.7.3的版本,使用POI检索功能的时候,想直接使用PoiOverlay类创建对象把检索出来的结果在地图上表示出来.按照正常的方法如下: 可是无论如何也没有也 ...

  8. android6.0 百度地图,Android百度地图SDK 导航SDK2.0结合定位SDK6.0.5的导航参数设置方法...

    是否执行成功 其中对于算路的节点,现在有了一个新的规则,可见BNRoutePlanNode 取文档的释义如下: public BNRoutePlanNode(double longitude, dou ...

  9. 百度地图SDK v3.6.0以上版本setOnMarkerClickListener 失效的问题解决

    不多说上代码 原本是这样的 我测试的版本是 百度的 3.7.3版本. 再次使用上面代码 失效了. 后来论坛各种找,没有结果.再后来 去看百度的源码.发现 由于这个 百度OverLay这个类开源了.所以 ...

最新文章

  1. 中国芯片将靠此超车!RISC-V架构神在哪全解构
  2. 考研数学一2015年真题整理
  3. java培训学费_参加java培训大概的费用是多少钱?
  4. 列出系统所有未被Business transaction 引用的Products集合
  5. [2020.11.4NOIP模拟赛]简单的打击【NTT】
  6. 技术圈儿007---Redis 生产架构选型解决方案
  7. 开发者自述:我是如何从 0 到 1 走进 Kaggle 的
  8. ML 12 13 mixture of gaussions and EM
  9. 通过OKhttp3 访问 https地址
  10. python编辑快速上手_Python编程如何快速上手,答案在这里
  11. 蓝桥杯 C语言 试题 历届试题 格子刷油漆
  12. 飞行管理计算机在ATA章节,民航ATA章节中英文对照.docx
  13. 从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
  14. python 关联矩阵_创建关联矩阵
  15. 面试中被问到:你在工作中碰到的最困难的问题是什么?
  16. 7.11 不区分大小写的匹配
  17. W806做电机转速调控
  18. WgpSec(狼组安全) CTF PHPCode题目记录
  19. 黑猴子的家:Minimal Install VS Server with GUI VS GNOME Desktop
  20. 保险行业CRM客户关系管理系统解决方案

热门文章

  1. POJ1629:picnic planning
  2. 《计算机科学概论》—第2章2.2节位置记数法
  3. 搭建Ubuntu下c/c++编译环境【转】
  4. 小菜学设计模式——命令模式
  5. i-jetty环境搭配与编译
  6. 居住7年未交一分钱天然气使用费 女房主替租户偿还近4万元欠款
  7. Java基础-Eclipse第三方安装包管理工具之Maven
  8. C#模拟POST提交表单(二)--HttpWebRequest以及HttpWebResponse
  9. 浅谈 Java Printing
  10. 寄存器位查看小工具.exe