Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37730469
在上一篇博客中,我们成功把地图导入了我们的项目。本篇我们准备为地图添加:第一,定位功能;第二,与方向传感器结合,通过旋转手机进行道路的方向确认。有了这两个功能,地图已经可以为我服务了~~~~
效果图:
好了,可以代码,为了方便,我把所有的按钮都放到了menu菜单中。
1、初次启动定位
- /**
- * 定位的客户端
- */
- private LocationClient mLocationClient;
- /**
- * 定位的监听器
- */
- public MyLocationListener mMyLocationListener;
- /**
- * 当前定位的模式
- */
- private LocationMode mCurrentMode = LocationMode.NORMAL;
- /***
- * 是否是第一次定位
- */
- private volatile boolean isFristLocation = true;
- /**
- * 初始化定位相关代码
- */
- private void initMyLocation()
- {
- // 定位初始化
- mLocationClient = new LocationClient(this);
- mMyLocationListener = new MyLocationListener();
- mLocationClient.registerLocationListener(mMyLocationListener);
- // 设置定位的相关配置
- LocationClientOption option = new LocationClientOption();
- option.setOpenGps(true);// 打开gps
- option.setCoorType("bd09ll"); // 设置坐标类型
- option.setScanSpan(1000);
- mLocationClient.setLocOption(option);
- }
然后是定位的监听器MyLocationListener:
- /**
- * 实现实位回调监听
- */
- public class MyLocationListener implements BDLocationListener
- {
- @Override
- public void onReceiveLocation(BDLocation location)
- {
- // map view 销毁后不在处理新接收的位置
- if (location == null || mMapView == null)
- return;
- // 构造定位数据
- MyLocationData locData = new MyLocationData.Builder()
- .accuracy(location.getRadius())
- // 此处设置开发者获取到的方向信息,顺时针0-360
- .direction(mXDirection).latitude(location.getLatitude())
- .longitude(location.getLongitude()).build();
- mCurrentAccracy = location.getRadius();
- // 设置定位数据
- mBaiduMap.setMyLocationData(locData);
- mCurrentLantitude = location.getLatitude();
- mCurrentLongitude = location.getLongitude();
- // 设置自定义图标
- BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
- .fromResource(R.drawable.navi_map_gps_locked);
- MyLocationConfigeration config = new MyLocationConfigeration(
- mCurrentMode, true, mCurrentMarker);
- mBaiduMap.setMyLocationConfigeration(config);
- // 第一次定位时,将地图位置移动到当前位置
- if (isFristLocation)
- {
- isFristLocation = false;
- LatLng ll = new LatLng(location.getLatitude(),
- location.getLongitude());
- MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
- mBaiduMap.animateMapStatus(u);
- }
- }
- }
可以看到,我们初始化了定位的参数,设置了定位的监听器,每隔1s会进行一次定位,应用打开时,第一定位,会把地图中心设置当前用户位置。
定位也是比较耗电的,所以我们在onStart中开启定位,在onStop中关闭定位~~这样应用最小化时就不会一直在哪GPS请求定位了,用户要是看你app一直在那定位,估计马上就被卸载了~
- @Override
- protected void onStart()
- {
- // 开启图层定位
- mBaiduMap.setMyLocationEnabled(true);
- if (!mLocationClient.isStarted())
- {
- mLocationClient.start();
- }
- // 开启方向传感器
- myOrientationListener.start();
- super.onStart();
- }
- @Override
- protected void onStop()
- {
- // 关闭图层定位
- mBaiduMap.setMyLocationEnabled(false);
- mLocationClient.stop();
- // 关闭方向传感器
- myOrientationListener.stop();
- super.onStop();
- }
上面的传感器的代码,一会就会介绍~
记得在AndroidManifest.xml配一个service
- <service
- android:name="com.baidu.location.f"
- android:enabled="true"
- android:process=":remote" >
- <intent-filter>
- <action android:name="com.baidu.location.service_v2.2" >
- </action>
- </intent-filter>
- </service>
现在基本的定位功能已经实现了~不过我们还需要添加点击定位按钮和方向传感器
2、我的位置
点击我的位置菜单会调用center2myLoc方法。
- case R.id.id_menu_map_myLoc:
- center2myLoc();
- break;
- /**
- * 地图移动到我的位置,此处可以重新发定位请求,然后定位;
- * 直接拿最近一次经纬度,如果长时间没有定位成功,可能会显示效果不好
- */
- private void center2myLoc()
- {
- LatLng ll = new LatLng(mCurrentLantitude, mCurrentLongitude);
- MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
- mBaiduMap.animateMapStatus(u);
- }
很简单,我们在定位的监听器中已经保存了最近一次的定位经纬度,所以只需要点击时,把地图移动到相应的位置即可。
3、集成方向传感器
首先是封装的方向传感器的类MyOrientationListener.java
- package com.zhy.zhy_baidu_ditu_demo00;
- import android.content.Context;
- import android.hardware.Sensor;
- import android.hardware.SensorEvent;
- import android.hardware.SensorEventListener;
- import android.hardware.SensorManager;
- public class MyOrientationListener implements SensorEventListener
- {
- private Context context;
- private SensorManager sensorManager;
- private Sensor sensor;
- private float lastX ;
- private OnOrientationListener onOrientationListener ;
- public MyOrientationListener(Context context)
- {
- this.context = context;
- }
- // 开始
- public void start()
- {
- // 获得传感器管理器
- sensorManager = (SensorManager) context
- .getSystemService(Context.SENSOR_SERVICE);
- if (sensorManager != null)
- {
- // 获得方向传感器
- sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
- }
- // 注册
- if (sensor != null)
- {//SensorManager.SENSOR_DELAY_UI
- sensorManager.registerListener(this, sensor,
- SensorManager.SENSOR_DELAY_UI);
- }
- }
- // 停止检测
- public void stop()
- {
- sensorManager.unregisterListener(this);
- }
- @Override
- public void onAccuracyChanged(Sensor sensor, int accuracy)
- {
- }
- @Override
- public void onSensorChanged(SensorEvent event)
- {
- // 接受方向感应器的类型
- if (event.sensor.getType() == Sensor.TYPE_ORIENTATION)
- {
- // 这里我们可以得到数据,然后根据需要来处理
- float x = event.values[SensorManager.DATA_X];
- if( Math.abs(x- lastX) > 1.0 )
- {
- onOrientationListener.onOrientationChanged(x);
- }
- // Log.e("DATA_X", x+"");
- lastX = x ;
- }
- }
- public void setOnOrientationListener(OnOrientationListener onOrientationListener)
- {
- this.onOrientationListener = onOrientationListener ;
- }
- public interface OnOrientationListener
- {
- void onOrientationChanged(float x);
- }
- }
在onCreate中初始化方向传感器
- /**
- * 初始化方向传感器
- */
- private void initOritationListener()
- {
- myOrientationListener = new MyOrientationListener(
- getApplicationContext());
- myOrientationListener
- .setOnOrientationListener(new OnOrientationListener()
- {
- @Override
- public void onOrientationChanged(float x)
- {
- mXDirection = (int) x;
- // 构造定位数据
- MyLocationData locData = new MyLocationData.Builder()
- .accuracy(mCurrentAccracy)
- // 此处设置开发者获取到的方向信息,顺时针0-360
- .direction(mXDirection)
- .latitude(mCurrentLantitude)
- .longitude(mCurrentLongitude).build();
- // 设置定位数据
- mBaiduMap.setMyLocationData(locData);
- // 设置自定义图标
- BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory
- .fromResource(R.drawable.navi_map_gps_locked);
- MyLocationConfigeration config = new MyLocationConfigeration(
- mCurrentMode, true, mCurrentMarker);
- mBaiduMap.setMyLocationConfigeration(config);
- }
- });
- }
最后在onStart和onStop中分别开启和关闭方向传感器。
对于旋转手机确定方向,实际上利用了
- new MyLocationData.Builder()
- //此处设置开发者获取到的方向信息,顺时针0-360 .direction(mXDirection)
只需要把x方向的角度设置即可~~~是不是很简单~~~
好了,介绍完毕了,关闭地图样式的切换,以及跟随、罗盘等模式的切换就不介绍了,大家自己看下源码~~
源码点击下载
注:开发者key需要换成自己申请的,不清楚申请的请看第一篇博客的。
Android 百度地图 SDK v3.0.0 (二) 定位与结合方向传感器的更多相关文章
- Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...
- Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...
- Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...
- Android 百度地图 SDK v3.0.0 (四) 离线地图功能介绍
转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直认为地图应用支持离线地图非常重要啊.我等移动2G屌丝,流量不易 ...
- Android 百度地图 SDK v3.0.0 (一)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SD ...
- 《第一行代码》(三: Android 百度地图 SDK v3.0.0)
百度地图的SDK变化较大,第一行代码里的demo已经不能用了,一直以为是代码类错误,害我花了很多时间,可以参考这位博主的:http://blog.csdn.net/lmj623565791/artic ...
- Android百度地图SDK 导航初始化和地图初始化引起的冲突
如题,相同是百度地图SDK开发过程中遇到的一个问题.交代下背景: 开发了一款内嵌百度地图的应用,因此里面差点儿相同将眼下百度地图SDK开放的主要功能都用到了,定位,地图显示,覆盖物标示.POI搜索,行 ...
- Android 百度地图SDK 定位
引用locSDK_6.1.3.jar,切记添加相应的so文件. 1.定位初始化,需要使用getApplicationContext() mLocClient = new LocationClient( ...
- [android] 百度地图开发 (两).所在地的城市定位和城市POI搜索
一个. 百度地图城市位置和POI搜索知识 上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定 ...
随机推荐
- C# 深入浅出 委托与事件
C#中的委托和事件的概念接触很久了,但是一直以来总没有特别透彻的感觉,现在我在这里总结一下: 首先我们要知道委托的由来,为什么要使用委托了? 我们先看一个例子: 假设我们有这样一个需求,需要计算在不同 ...
- 【USACO 2.1.4】荷斯坦奶牛
[题目描述] 纪念“逝去”的Wecing 农民JOHN以拥有世界上最健康的奶牛为傲.他知道每种饲料中所包含的牛所需的最低的维他命量是多少.请你帮助农夫喂养他的牛,以保持它们的健康,使喂给牛的饲料的种数 ...
- JS响应事件整理
javascript事件列表解说 事件 浏览器支持 解说 一般事件 onclick IE3.N2 鼠标点击时触发此事件 ondblclick IE4.N4 鼠标双击时触发此事件 onmousedown ...
- mysql for linux 数据库的安装过程
mysql for linux 数据库的安装过程 l 安装版本:mysql-advanced-5.6.12-linux-glibc2.5-x86_64.tar.gz ,此版本是绿色版本,只需要将其解 ...
- 两个示例介绍JavaScript的闭包
JavaScript的闭包有两个用途:一个是访问函数内部的变量:另一个是让变量的值在作用域内保持不变.函数是JavaScript 中唯一有作用域的对象,因此JavaScript的闭包依赖于函数实现,下 ...
- Spring4.0学习笔记(10) —— Spring AOP
个人理解: Spring AOP 与Struts 的 Interceptor 拦截器 有着一样的实现原理,即通过动态代理的方式,将目标对象与执行对象结合起来,降低代码之间的耦合度,主要运用了Proxy ...
- IOS--UIAlertView的使用方法详细
IOS--UIAlertView的使用方法详细 // UIAlertView的常用方法 // 标准样式 UIAlertView *oneAlertView = [[UIAlertView allo ...
- asp.net 后台使用js弹窗失效问题
1.这些事件输出来前后都变成JS代码了,看到到这样的代码的了.会变成<script>alert('合同号XXX已存在')</script>首先后台调试一下看看Page.Clie ...
- Chapter 2. OpenSSL的安装和配置学习笔记
Chapter 2. OpenSSL的安装和配置学习笔记 2.1 在linux上面安装OpenSSL我还是做点No paper事情比较在行,正好和老师的课程接轨一下.以前尝试过在Windows上面安装 ...
- 《简明python教程》学习笔记,长文
引号: 单引号:如果包含的字符串里有单引号的话,需要在那个单引号里加转义符号,或者使用双引号 例:print 'he"llo' or print 'he\'llo' ===> h ...