概述:
Android平台提供了一些传感器让我们可以监测设备的运动情况. 其中的两种总是基于硬件的(加速度计和陀螺仪), 其中的三个是能软能硬的(重力计, 线性加速计和旋转矢量传感器). 比如, 在一些设备上基于软件的传感器会从加速度计和磁力计来计算它们的数据, 但是在其它设备上它们可能也使用陀螺仪来作为它们的数据来源. 大多数Android设备都拥有一个加速度计, 很多都已经包含陀螺仪. 基于软件的传感器的可用性更加多样, 因为它们通常依赖于一个或一个以上的硬件传感器来作为数据来源.
运动传感器顾名思义是用于监测设备移动的, 比如倾斜, 摇动, 旋转或摆动等. 这种运动通常来源于用户的输入(栗如, 用户在汽车类的游戏中转动设备或者控制球类游戏等), 但是它也可以来自于设备本身的位置(比如设备跟着汽车一起运动). 第一个栗子中, 监测的是相对于设备作为参考框架. 第二个例子中则是相对于全世界做参考框架. 运动传感器本身通常不用来监测设备位置, 但是可以同其它传感器一起使用, 比如地磁传感器, 来确定设备相对于世界中的位置.
所有的运动传感器都会在SensorEvent中返回传感器值的多维数组. 比如, 在一个传感器事件中, 加速计会为坐标系的三个方向返回加速度数据, 陀螺仪返回三维旋转速率数据. 这些数据值以float数组格式同其它SensorEvent参数一起返回. 下表总结了Android平台上可用的运动传感器:
传感器 |
SensorEvent数据 |
描述 |
测量单位 |
TYPE_ACCELEROMETER |
SensorEvent.values[0] |
沿x轴的加速度(包括重力) |
m/s2(平方) |
SensorEvent.values[1] |
沿y轴的加速度(包括重力) |
||
SensorEvent.values[2] |
沿z轴的加速度(包括重力) |
||
TYPE_GRAVITY |
SensorEvent.values[0] |
沿x轴的重力 |
m/s2 |
SensorEvent.values[1] |
沿y轴的重力 |
||
SensorEvent.values[2] |
沿z轴的重力 |
||
TYPE_GYROSCOPE |
SensorEvent.values[0] |
绕x轴旋转的速率 |
rad/s |
SensorEvent.values[1] |
绕y轴旋转的速率 |
||
SensorEvent.values[2] |
绕z轴旋转的速率 |
||
TYPE_GYROSCOPE_UNCALIBRATED |
SensorEvent.values[0] |
绕x轴的旋转速率(无偏移补偿) |
rad/s |
SensorEvent.values[1] |
绕y轴的旋转速率(无偏移补偿) |
||
SensorEvent.values[2] |
绕z轴的旋转速率(无偏移补偿) |
||
SensorEvent.values[3] |
绕x轴的预计偏移 |
||
SensorEvent.values[4] |
绕y轴的预计偏移 |
||
SensorEvent.values[5] |
绕z轴的预计偏移 |
||
TYPE_LINEAR_ACCELERATION |
SensorEvent.values[0] |
沿x轴的加速度(不包括重力) |
m/s2 |
SensorEvent.values[1] |
沿y轴的加速度(不包括重力) |
||
SensorEvent.values[2] |
沿z轴的加速度(不包括重力) |
||
TYPE_ROTATION_VECTOR |
SensorEvent.values[0] |
沿x轴旋转矢量分量(x*sin(θ/2)). |
无单位 |
SensorEvent.values[1] |
沿y轴旋转矢量分量(y*sin(θ/2)). |
||
SensorEvent.values[2] |
沿z轴旋转矢量分量(z*sin(θ/2)). |
||
SensorEvent.values[3] |
旋转向量的标量分量((cos(θ/2)).(标量分量是可选的) |
||
TYPE_SIGNIFICANT_MOTION |
N/A |
N/A |
N/A |
TYPE_STEP_COUNTER |
SensorEvent.values[0] |
从传感器激活那一刻起的步数 |
步数 |
TYPE_STEP_DETECTOR |
N/A |
N/A |
N/A |
旋转矢量传感器和重力传感器是运动检测中使用频率最高的传感器. 旋转矢量传感器是多功能的, 可以广泛的用于运动相关的任务, 比如检测手势, 检测角度改变, 检测相关的方向变化. 在开发游戏的时候经常用到旋转矢量传感器, 还有增强现实的应用, 二维或者三维的罗盘, 或者一个相机稳定的APP. 在大多数的情况下, 使用这些传感器会比用加速度计和磁力计或者方向传感器更好.
Android开源工程传感器:
Android Open Source Project(AOSP)提供了三种基于软件的运动传感器: 一个重力传感器, 一个线性加速度传感器, 还有一个旋转矢量传感器. 这些传感器在Android 4.0中添加, 现在使用设备的陀螺仪来提高稳定性和性能. 如果想要尝试一下这些传感器, 可以使用getVendor()和getVersion()方法(vendor是Google公司, 版本号是3). 使用vendor和version来识别这些传感器是必要的, 因为Android将这三个传感器作为辅助传感器. 比如如果一个设备供应商提供了它们的重力传感器, 那么AOSP重力传感器将会作为一个辅助备用的传感器来显示. 所有的这三个传感器都依赖于陀螺仪: 如果设备没有陀螺仪, 这些传感器将不会显示也不能用.
使用加速度计:
加速度传感器用来测量设备的加速度, 包括重力. 下面的代码演示了如何获取一个加速度传感器的实例:
private SensorManager mSensorManager;
private