Android开发者指南-方位传感器-Position Sensor

转载自:http://blog.sina.com.cn/s/blog_48d4913001010zsu.html

Position Sensors


英文原文:http://developer.android.com/guide/topics/sensors/sensors_position.html

版本:Android 4.0 r1 - 08 Mar 2012 0:34

Android 平台提供了两种传感器来检测设备的方位:地磁传感器和方向传感器。 Android 平台还提供了一种传感器,用于检测屏幕表面与其它物体的邻近程度,即被称为距离传感器。 地磁传感器和距离传感器是基于硬件的。大部分手持和桌面设备都内置了地磁传感器。手持设备通常还内置了距离传感器,用于检测与人脸的靠近程度(比如在通话过程中)。 而方向传感器是基于软件的,它的数据来自加速度传感器和地磁传感器。

注意: 自 Android 2.2 (API Level 8) 起,方向传感器已过时。

方位传感器用于确定设备相对地球的物理方位。比如,你可以用地磁传感器和加速度传感器来确定设备相对北极点的方位。 你还可以用方向传感器(或类似的基于传感器的判断方向的方法)来确定设备相对你自己参照系的方位。 方位传感器通常不会用于监测设备的移动情况,诸如震动、倾斜、冲击(详见 运动传感器)。

地磁传感器和方向传感器在 SensorEvent 中返回以多维数组表示的传感器数据。 比如,方向传感器在传感器事件中提供了三个坐标轴方向的地磁强度。 同理,方向传感器还在事件中给出了方位角(侧倾度)、俯仰度和翻滚度。
关于传感器使用的坐标系,请参阅 传感器的坐标系。 距离传感器在事件中给出的是一个值。表 1列出了 Android 平台支持的所有方位传感器。

表 1. Android 平台支持的方位传感器

传感器 传感器事件中的数据 说明 计量单位
TYPE_MAGNETIC_FIELD SensorEvent.values[0] x 轴的地磁强度 μT
SensorEvent.values[1] y 轴的地磁强度
SensorEvent.values[2] z 轴的地磁强度
TYPE_ORIENTATION1 SensorEvent.values[0] 侧倾度(围绕 z 轴的角度)
SensorEvent.values[1] 俯仰度(围绕 x 轴的角度)
SensorEvent.values[2] 翻滚度(围绕 y 轴的角度)
TYPE_PROXIMITY SensorEvent.values[0] 与物体的距离2 cm
1 此传感器在 Android 2.2 (API Level 8) 之后已过时。传感器框架为检测设备的方向提供了替代的方法,参见使用方向传感器
2 某些距离传感器只提供二进制的距离值。

使用方向传感器

方向传感器用于监测设备相对地球的方位(其实是地球磁场)。以下代码展示了如何获取缺省的方向传感器的一个实例:

private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);

方向传感器的数据来自设备的地磁传感器和加速度传感器。利用这两种硬件传感器,方向传感器提供了以下三个方向的数据:

  • 侧倾度(围绕 z 轴的旋转角)。这是指设备 y 轴与地磁北极间的夹角。例如,如果设备的 y 轴指向地磁北极则该值为 0,如果 y 轴指向南方则该值为 180。 同理,y 轴指向东方则该值为 90,而指向西方则该值为 270。
  • 俯仰度(围绕 x 轴的旋转角)。当 z 轴的正值部分朝向 y 轴的正值部分旋转时,该值为正。 当 z 轴的正值部分朝向 y 轴的负值部分旋转时,该值为负。取值范围为 -180 度到 180 度。
  • 翻滚度(围绕 y 轴的旋转角)。当 z 轴的正值部分朝向 x 轴的正值部分旋转时,该值为正。 当 z 轴的正值部分朝向 x 轴的负值部分旋转时,该值为负。取值范围为 -90 度到 90 度。

以上定义与航空学上的不同,那里的 X 轴是指飞机的长轴(从机尾至机首)。 并且,由于历史的原因,翻滚度也是以顺时针方向为正(从数学上讲,应该是逆时针方向为正)。

方向传感器的数据是对加速度和地磁传感器的原始数据进行处理之后再报送出来的。 因为处理工作比较繁重,方向传感器的精度和准确度会有所降低(只有在翻滚度为 0 时此传感器的数据才是可靠的)。 因此,方向传感器自 Android 2.2 (API level 8) 开始已经过时了。 作为直接使用方向传感器原始数据的替代方案,我们建议你结合getRotationMatrix() 和 getOrientation() 方法来来计算方向值。你还可以用 remapCoordinateSystem() 方法来把方向值转换为应用程序自定义参照系的坐标。

以下例程展示了如何直接向方向传感器请求方向数据。我们建议你只在设备翻滚度可以忽略时才使用这种方式。

public class SensorActivity extends Activity implements SensorEventListener {   private SensorManager mSensorManager;   private Sensor mOrientation;   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);     mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);   }   @Override   public void onAccuracyChanged(Sensor sensor, int accuracy) {     // 执行一些传感器精度变动后的相关工作     // 必须实现本回调方法的代码   }   @Override   protected void onResume() {     super.onResume();     mSensorManager.registerListener(this, mOrientation, SensorManager.SENSOR_DELAY_NORMAL);   }   @Override   protected void onPause() {     super.onPause();     mSensorManager.unregisterListener(this);   }   @Override   public void onSensorChanged(SensorEvent event) {     float azimuth_angle = event.values[0];     float pitch_angle = event.values[1];     float roll_angle = event.values[2];     // 利用这些方向角度执行工作   } }

通常你不需要对方向传感器的数据进行任何处理或过滤,当然以应用程序自定义参照系进行坐标转换除外。Accelerometer Play 范例展示了如何把加速度传感器数据转换为其它参照系坐标的过程;方向传感器也可以采用类似的技术来完成转换。

使用地磁传感器

地磁传感器使你能监测地球磁场的变化。以下代码展示了如何获取缺省的地磁传感器的一个实例:

private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);

此传感器提供了三维坐标轴方向上的原始的磁场强度数据(单位μT)。通常,你不需要直接使用此传感器。 取而代之的是,你可以用旋转向量传感器来测量旋转的原始数据,或者联合使用加速度计、地磁传感器、getRotationMatrix() 方法来获取旋转矩阵和倾角矩阵。然后,你可以通过
a href="http://developer.android.com/reference/android/hardware/SensorManager.html#getOrientation(float[], float[])">getOrientation() 和 getInclination() 根据这些矩阵数据得到侧倾度和地磁倾角数据。

使用距离传感器

距离传感器使你能检测设备距离某物体的远近程度。以下代码展示了如何获取缺省的距离传感器的一个实例:

private SensorManager mSensorManager; private Sensor mSensor; ...mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);

距离传感器通常用于确定用户头部与手持设备屏幕表面的距离(比如,用户拨打或接听电话时)。 大部分距离传感器返回的是绝对距离,单位是 cm,但某些传感器只能返回远近程度值。 以下代码展示了距离传感器的使用:

public class SensorActivity extends Activity implements SensorEventListener {   private SensorManager mSensorManager;   private Sensor mProximity;   @Override   public final void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     // 获取传感器设备的一个实例,并用它获取某个特定的传感器     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);     mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);   }   @Override   public final void onAccuracyChanged(Sensor sensor, int accuracy) {     // 在这里进行一些传感器精度改变后的处理   }   @Override  public final void onSensorChanged(SensorEvent event) {     float distance = event.values[0];     // 处理当前的传感器数据   }  @Override   protected void onResume() {     // 注册一个传感器侦听器     super.onResume();     mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL);   }   @Override   protected void onPause() {     // 请在 activity 暂停时确保注销传感器     super.onPause();     mSensorManager.unregisterListener(this);   } }
注意: 某些距离传感器返回的是代表远近程度的二进制数值。 这种情况下,传感器通常把最大量程表示为“远”,小于量程的值则为“近”。 “远”值典型为> 5 cm,但这因传感器而异。 你可以用getMaximumRange() 方法来确定传感器的最大量程。

Android开发者指南-方位传感器-Position Sensor的更多相关文章

  1. Android开发者指南(9) —— ProGuard

    转: 前言 本章内容为开发者指南(Dev Guide)/Developing/Tools/ProGuard,本章内容为"混淆器",版本为Android3.0 r1,翻译来自:&qu ...

  2. 英特尔 Android* 开发者指南上的对等应用

    简单介绍 当没有 Wi-Fi 訪问点或互联网訪问时,Android* 应用可能须要对等连接在两台或多台 Android* 设备之间建立连接. 比方,文件共享应用和多人游戏. 该功能可使用 NFC.蓝牙 ...

  3. Android开发者指南-用户界面-拖放-Drag and Drop[原创译文]

      英文原文:http://developer.android.com/guide/topics/ui/drag-drop.html 版本:Android 4.0 r1 译者注:黄色底色为未决译文 快 ...

  4. 转 Android开发者指南-Manifest.xml-<supports-screens

    <supports-screens> 版本:Android 3.2 语法: <supports-screensandroid:resizeable=["true" ...

  5. 开源Android容器化框架Atlas开发者指南

    Atlas是古希腊神话中的天神,是波士顿动力公司的机器人,借助搜索引擎,得以发现这个名词背后许许多多的含义.在手机淘宝,Atlas是一个扎根于Android客户端的一个组件化容器框架,相比神话中用手和 ...

  6. Android开发10:传感器器及地图相关应用

    前言 啦啦啦~各位小伙伴们好~经过这一学期的Android知识的学习,我们学到了很多和Android开发相关的知识,这一学期的学习也要告一段落了. 一起进入我们今天的相关内容~这次我们将一起学习使用 ...

  7. Android学习笔记--获取传感器信息

    相关资料: 传感器的坐标与读数:http://www.cnblogs.com/mengdd/archive/2013/05/19/3086781.html 传感器介绍及指南针原理:http://www ...

  8. Android API 指南

    原文链接:http://android.eoe.cn/topic/android_sdk Android API 指南 - Android API Guides 应用的组成部分 - Applicati ...

  9. 《Android学习指南》文件夹

    转自:http://android.yaohuiji.com/about Android学习指南的内容分类: 分类 描写叙述 0.学习Android必备的Java基础知识 没有Java基础的朋友,请不 ...

随机推荐

  1. 从本地上传整个目录到hdfs的java程序

    首先在网上找了好久没有找到从本地文件系统上传整个目录到hdfs文件系统的程序,权威指南上也没有,都是单个文件上传,所以这里自己编写了一个程序,封装成jar包执行能够复制. 先说明一下代码:须要手动输入 ...

  2. QStyleFactory类参考

      QStyleFactory类创建QStyle对象.#include <QStyleFactory> 静态公有成员QStyle* create(const QString & k ...

  3. Enable SPI 1.0 and 1.1 with device tre overlays on BeagleBone

    For most people the above image means absolutely nothing, but for that one guy that has been searchi ...

  4. apache solr简单搭建

    首先,下载位置是:http://lucene.apache.org/solr/downloads.html 官网的学习资料:http://lucene.apache.org/solr/quicksta ...

  5. Beyond REST: How to build a HATEOAS API in Java with Spring MVC, Jersey (JAX-RS) and VRaptor

    http://zeroturnaround.com/rebellabs/beyond-rest-how-to-build-a-hateoas-api-in-java-with-spring-mvc-j ...

  6. Redis操作List工具类封装,Java Redis List命令封装

    Redis操作List工具类封装,Java Redis List命令封装 >>>>>>>>>>>>>>>> ...

  7. R-大数据分析挖掘(4-R爬虫实现)

     library("XML") #获取全部的链接 url <- 'http://www.csdn.net/tag/' i_url_parse<-htmlParse(ur ...

  8. NChome如何创建单据跟主子表还有扩展开发要怎么弄?

    单据表跟主子表笔记做在笔记本里面 扩展开发在网络备份里面

  9. 一个transaction异常的处理

    11-16 14:13:47.715: W/dalvikvm(16771): threadid=1: thread exiting with uncaught exception (group=0x4 ...

  10. ACM——A + B Problem (1)

    A + B Problem (1) 时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte总提交:5907            测试通过:151 ...