要想实现指南针功能,android中不是有方向传感器吗?其实android的方向传感器不是物理实际存在的,它只是逻辑上的,什么意思,就是它是通过磁力计和加速度计抽象出来的。因此,这个方位的获得其实是通过这两个传感器的数据通过一定的算法得到的。而这个算法则封装在了api中,我们只需直接使用即可。

一般情况下,在android系统中获取手机的方位信息azimuth似乎是很简单的事情,在api中有TYPE_ORIENTATION常量,可以像得到加速度传感器那样得到方向传感器sm.getDefaultSensor(Sensor.TYPE_ORIENTATION);然而我们这样做的话在最新版的SDK中就会看到这么一句话:“TYPE_ORIENTATION  This constant is deprecated. use SensorManager.getOrientation() instead. ”即这种方式也过期,不建议使用!Google建议我们在应用程序中使用SensorManager.getOrientation()来获得原始数据。

下面介绍获取流程,先看看器定义:

public static float[] getOrientation (float[] R, float[] values)

第一个参数是R[] 是一个旋转矩阵,用来保存磁场和加速度的数据,可以理解为这个函数的传入值,通过它这个函数给你求出方位角。

第二个参数就是这个函数的输出了,他有函数自动为我们填充,这就是我们想要的。

values[0]  :azimuth 方向角,但用(磁场+加速度)得到的数据范围是(-180~180),也就是说,0表示正北,90表示正东,180/-180表示正南,-90表示正西。而直接通过方向感应器数据范围是(0~359)360/0表示正北,90表示正东,180表示正南,270表示正西。

values[1]  pitch 倾斜角  即由静止状态开始,前后翻转

values[2]  roll 旋转角 即由静止状态开始,左右翻转

现在问题是这个R[]怎么获取,其实他是通过函数getRotationMatrix得到的。

再看看getRotationMatrix的定义:

public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic)

解释以下参数,第一个就是我们需要填充的R数组,大小是9

第二个是是一个转换矩阵,将磁场数据转换进实际的重力坐标中 一般默认情况下可以设置为null

第三个是一个大小为3的数组,表示从加速度感应器获取来的数据  在onSensorChanged中

第四个是一个大小为3的数组,表示从磁场感应器获取来的数据    在onSensorChanged中

实现代码如下:

1、初始化

public void init(Context context){mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);// 初始化加速度传感器accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);// 初始化地磁场传感器magnetic = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);//注册监听mSensorManager.registerListener(mSensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_UI);mSensorManager.registerListener(mSensorEventListener, magnetic, SensorManager.SENSOR_DELAY_UI);Log.d(TAG, TAG+" init");
}

2、数据监听

class CompassSensorEventListener implements SensorEventListener {@Overridepublic voidonSensorChanged(SensorEvent event) {if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {accelerometerValues = event.values;}if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {magneticFieldValues = event.values;}calculateOrientation();}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}}

3、计算角度,最后返回的方向orientation是以正北为0度,顺时针方向增加到360度

private void calculateOrientation() {float[] values = new float[3];float[] R = new float[9];SensorManager.getRotationMatrix(R, null, accelerometerValues, magneticFieldValues);SensorManager.getOrientation(R, values);values[0] = (float) Math.toDegrees(values[0]);float orientation = values[0];if(orientation<0){orientation = 360+orientation;}orientation += mRotation;if (orientation>360){orientation -= 360;}for (CompassLister lister: mCompassListers){lister.onOrientationChange(orientation);}Log.d(TAG, values[0] + "");
}

3、计算东南西北

    private CompassManager mCompassManager;private String mOrientaionText[] = new String[]{"北","东北","东","东南","南","西南","西","西北"};private TextView mAngleTextview;private TextView mOrientaionTextview;private CompassManager.CompassLister mCompassLister = new CompassManager.CompassLister() {@Overridepublic void onOrientationChange(float orientation) {Log.e(TAG, "onOrientationChange: orientation "+ orientation);mOrientaionTextview.setText(mOrientaionText[((int) (orientation+22.5f)%360)/45]);mAngleTextview.setText(orientation+"");}};

4、最后,源码上传至:http://download.csdn.net/detail/wsx1048/9703831

效果图如下:

Android 获取指南针数据相关推荐

  1. android获取mysql数据_java – Android从mySql获取数据

    我必须从服务器上的MySQL数据库中获取一些数据.我有以下代码.但是当我运行它时应用程序崩溃了.即使我在Android Manifest中指定了Internet权限,我也会在Logcat中获得Perm ...

  2. android—获取网络数据

    取网络数据主要靠发交易(或者说请求,接口等),而这些交易由java中的网络通信,HttpURLConnection和HttpClient实现,以下是具体例子. 大家都知道,网络通信,发送请求有两种方式 ...

  3. Android 获取通讯录数据

    /*** 获取通讯录数据*/ public class ContactUtils {@SuppressLint("Range")public static ArrayList< ...

  4. Android 获取天气数据

    /**      * 天气API      * @param cityname      * @return      */     private String getUrl(String city ...

  5. ios imei android,获取手机(ios,android)的设备唯一码(mac地址, IMEI)

    获取手机(ios,android)的设备唯一码(mac地址, IMEI) app中总会用到客户端下载量数据统计,一般都是用的设备的唯一码作为标示,以下是获取mac地址的代码片段,记录备份. andro ...

  6. Android Volley 库通过网络获取 JSON 数据

    本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 环境 演示 Volley 库通过网络获取 JSON 数据 参考资料 Android 关于网络操作一般都会介绍 HttpC ...

  7. android 获取加速度传感器值,Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】...

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; im ...

  8. android客户端从服务器端获取json数据并解析的实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...

  9. 一个简单的Android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...

最新文章

  1. vue组件定义、组件的切换、组件的通信、渲染组件的几种方式(标签、路由、render)...
  2. nginx域名配置非80端口的301跳转
  3. [总结]vue开发常见知识点及问题资料整理(持续更新)
  4. WxWidgets :一些古怪的源代码
  5. struts2官方 中文教程 系列六:表单验证
  6. java7 uri,细数Java8中那些让人纵享丝滑的文件操作
  7. CentOS 6.5自动化运维之基于DHCP和TFTP服务的PXE自动化安装centos操作系统详解
  8. vs xgb 神经网络_业界 | 深度学习与XGBoost在小数据集上的测评,你怎么看?(附源码)...
  9. 「开发小技巧」07—如何使用HTML和CSS创建图像叠加图标?
  10. java 重定向到某个页面并弹出消息_前端面试100问之浏览器从输入URL到页面展示发生了什么...
  11. kubernetes 查看日志方法
  12. 易语言短信接口_易语言调用腾讯云发送短信例子源码
  13. windows server 2008 安装及VS2008和VS 2008 SP1安装
  14. python爬去百度图片_python爬虫之爬取百度图片
  15. ADC基本原理与STM32F030ADC应用
  16. 如何清空c盘只剩系统_使用win10不久,C盘只剩下500MB?这样操作,我清理出了30G空间!...
  17. 谷歌11亿美元买台企手机团队 对硬件有长远计划
  18. 颜色的前世今生21·Lab编码系统
  19. Excel如何快速删除空白行?替换部分字符?
  20. Linux查看文件夹的大小

热门文章

  1. Nature子刊 定制饮食去除半胱氨酸和蛋氨酸可诱导细胞自毁进而治疗脑瘤?
  2. PaddlePaddle笔记4-看图写诗
  3. 计算机组成原理mgk换算,计算机组成原理十套卷(本科)计算题及答案
  4. 量化 ZIG函数的python实现
  5. screen:There is no screen to be resumed matching XXX 解决办法
  6. 网安技术与应用(4)——配置iptables防御常见攻击
  7. 行业报告免费下载-干货!68份营销行业报告分享
  8. 如何查看手机APP的包名,并卸载
  9. 相机靶面尺寸和视场角换算
  10. CQOI2020 退役记