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. linux如何查进程、杀进程

    本文系转载,转载原文地址:http://blog.sina.com.cn/s/blog_637112040100vl53.html 1.查进程   ps命令查找与进程相关的PID号:   ps a 显 ...

  2. Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)

    PS:Nginx/LVS/HAProxy是目前使用最广泛的三种负载均衡软件,本人都在多个项目中实施过,参考了一些资料,结合自己的一些使用经验,总结一下. 一般对负载均衡的使用是随着网站规模的提升根据不 ...

  3. IDispose(), Finalize()

    C#  using 用法: 1. 作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型.(见例1-1) 2. 作为语句,用于定义一个范围,在此范围的末尾将释放对象.(见例1-2) (例子1- ...

  4. 网页设定固定背景图片(抄袭自百度FM)

    这个新技能,我是从百度FM中学习到的. 在网页中,有一个id为"body-bg"的层, html代码: <div id="body-bg" style=& ...

  5. ThinkPHP函数详解:N方法

    N方法属于计数器方法,被用于核心的查询.缓存统计的计数和统计.但是其实可以用于应用的其他计数用途,用法比较简单,调用格式:N('计数位置'[,'步进值'])例如,我们要统计页面中的查询次数,可以用 N ...

  6. Unity3D 之UGUI 面板

    UGUI中使用面板,可以对一组控件分为一个组. 一个面板里面可以添加一些控件,就如同Html中的<div>一样.

  7. word ppt excel文档转换成pdf

    1.把word文档转换成pdf (1).添加引用 using Microsoft.Office.Interop.Word; 添加引用 (2).转换方法 /// <summary> /// ...

  8. SQL Server delete、truncate、drop

    在T-SQL中这三个命令符,相信很多朋友都不会陌生的,我自己在工作也会常常使用到它们,虽然我们清除的知道用这三个命令符可以达到怎样的预期效果. 但是却很少深入的去了解它们,知道它们有什么区别,又各有什 ...

  9. A题笔记(12)

    No.1466  代码:https://code.csdn.net/snippets/192091 No.1202  代码:https://code.csdn.net/snippets/192110 ...

  10. SQL 查找存储过程及视图与自带函数

    查找所有所有存储过程的名称及信息select * from sysobjectswhere type='P' 查看存储过程定义语句sp_helptext [存储过程名] 查看所有视图及信息select ...