Position Sensors
Android平台提供了两个感应器,让你确定设备的位置:地磁传感器和方向传感器。 Android平台还提供了一个传感器,可以让你确定设备的脸有多接近一个对象(被称为接近传感器)。地磁场传感器和接近传感器是基于硬件的。大多数手机和平板电脑制造商包括地磁传感器。同样,手机制造商通常包括接近传感器,以确定何时被保持靠近用户的面部(例如,在电话呼叫)的手机。方位传感器是基于软件的,并从加速度计和地磁场传感器获得其数据。
注:方向传感器的Android 2.2(API级别8)被废弃。
位置传感器,用于确定在参考世界帧一个设备的物理位置是有用的。例如,您可以结合使用地磁传感器与加速度计来确定设备的相对磁北极的位置。您也可以使用方向传感器(或类似的基于传感器的定位方式),以确定设备在参考应用程序的框的位置。位置传感器通常不用于监控设备的运动,或运动,如抖动,倾斜,或推力(有关详细信息,请参阅运动传感器)。
地磁场传感器和方向传感器返回每个SensorEvent传感器值的多维阵列。例如,方向传感器的单个传感器事件期间为三个坐标轴的提供地磁强度值。同样地,方位传感器的单个传感器事件期间提供方位角(偏航),俯仰和翻滚值。有关由传感器使用的坐标系统的更多信息,请参阅传感器坐标系。接近传感器提供每个传感器事件的单个值。表1总结了所支持的Android平台上的位置传感器。
所支持的Android平台上表1.位置传感器。
传感器传感器事件数据说明测量单位
沿x轴TYPE_GAME_ROTATION_VECTOR SensorEvent.values [0]旋转矢量分量(X * SIN(θ/ 2))。无单位
沿y轴(y * SIN(θ/ 2))SensorEvent.values [1]旋转矢量分量。
沿z轴SensorEvent.values [2]旋转矢量成分(Z * SIN(θ/ 2))。
沿x轴TYPE_GEOMAGNETIC_ROTATION_VECTOR SensorEvent.values [0]旋转矢量分量(X * SIN(θ/ 2))。无单位
沿y轴(y * SIN(θ/ 2))SensorEvent.values [1]旋转矢量分量。
沿z轴SensorEvent.values [2]旋转矢量成分(Z * SIN(θ/ 2))。
TYPE_MAGNETIC_FIELD SensorEvent.values [0]沿x轴地磁的磁场强度。 μT
SensorEvent.values [1]沿y轴地磁的磁场强度。
SensorEvent.values [2]沿着z轴地磁的磁场强度。
沿x轴TYPE_MAGNETIC_FIELD_UNCALIBRATED SensorEvent.values [0]地磁场强(没有硬铁校准)。 μT
SensorEvent.values [1]地磁场强(没有硬铁校准)沿y轴。
SensorEvent.values [2]地磁场强(没有硬铁校准)沿z轴。
沿x轴SensorEvent.values [3]铁偏差估计。
沿y轴SensorEvent.values [4]铁偏差估计。
沿z轴SensorEvent.values [5]铁偏差估计。
TYPE_ORIENTATION1 SensorEvent.values [0]方位角(围绕Z轴的角度)。度
SensorEvent.values [1]间距(绕x轴角)。
SensorEvent.values [2]卷轴(绕y轴角)。
TYPE_PROXIMITY SensorEvent.values [0] object.2厘米的距离
1此传感器在Android 2.2的(API级别8)已过时。传感器框架提供用于获取设备取向,这是在使用方向传感器讨论的替代方法。
2有些接近传感器提供近及远仅代表二进制值。
使用游戏旋转矢量传感器
游戏旋转向量传感器是相同的旋转矢量传感器,除了它不使用地磁场。因此,Y轴不北,而是指向其它一些参考。该引用允许数量级的顺序相同的陀螺仪绕Z轴漂移漂移。
因为游戏旋转矢量传感器不使用磁场,相对的旋转是更精确,而不是由磁场的变化的影响。使用这种传感器在游戏中,如果你不关心,其中北,和正常旋转向量不适合,因为其对磁场的依赖您的需求。
下面的代码演示了如何获得默认的游戏旋转矢量传感器的一个实例:
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GAME_ROTATION_VECTOR);使用地磁旋转矢量传感器
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GEOMAGNETIC_ROTATION_VECTOR);
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);方位传感器通过使用设备的地磁场传感器的组合与设备的加速计获得它的数据。使用这两个硬件传感器,方位传感器提供了以下三个方面的数据:
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) { // Do something here if sensor accuracy changes. // You must implement this callback in your code. } @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]; // Do something with these orientation angles. } }你通常不会需要比翻译传感器的坐标系中参考应用程序的框架来执行任何数据处理或原始数据的过滤功能,您从一个方向传感器获得,其他。加速度计播放示例展示了如何加速度传感器数据转换成参考另一帧;该技术类似于你可能会和方向传感器使用的一个。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);该传感器为三个坐标轴的提供原始的场强数据(μT)。通常情况下,你不需要直接使用此传感器。相反,你可以使用旋转矢量传感器确定生旋转运动,也可以使用加速度计和地磁传感器会同getRotationMatrix()方法来获取旋转矩阵和倾角矩阵。然后,您可以使用这些矩阵与getOrientation()和getInclination()方法来获取方位和地磁倾角数据。
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY);接近传感器通常被用于确定一个人的头部多远是从面部一个手持通话器设备(例如,当用户发起或接收电话呼叫)。最接近传感器返回的绝对距离,在厘米,但有些仅返回远近值。下面的代码演示了如何使用接近传感器:
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); // Get an instance of the sensor service, and use that to get an instance of // a particular sensor. mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { float distance = event.values[0]; // Do something with this sensor data. } @Override protected void onResume() { // Register a listener for the sensor. super.onResume(); mSensorManager.registerListener(this, mProximity, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { // Be sure to unregister the sensor when the activity pauses. super.onPause(); mSensorManager.unregisterListener(this); } }注意:有些接近传感器返回代表“接近”或二进制值“远”。在这种情况下,该传感器通常报告在远状态的最大范围的值,并在邻近状态一个更低的值。通常情况下,远的值是一个值>5厘米,但是这可以从传感器变化到传感器。您可以通过使用获得最大范围()方法确定传感器的最大范围。