使用方向传感器
方向传感器会相对与地球参照系来监视设备的位置(特别是北极)。以下代码显示了如何获取默认的方向传感器的实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
通过使用设备的地磁场传感器跟加速度传感器的组合来获取方向传感器的数据。使用这两个硬件传感器,方向传感器能够提供以下三个维度的数据:
1. 方位角(围绕Z轴的旋转角度)。这是被和设备Y轴之间的角度。例如,如果设备的Y轴方向与北极一致,这该值是0,如果设备的Y轴指向南方,则该值是180。同样,当Y轴指向东方时,该值是90;指向西方时,该值是270。
2. 倾斜角(围绕X轴的旋转角度)。当正方向的Z轴向着正向的Y轴旋转时,该值是正值,当正方向的Z轴向着负方向的Y轴旋转时,该值是负值。它的取值范围是180度到-180度之间。
3. 转角(围绕Y轴旋转的角度)。当正方向的Z轴向着正向的X轴旋转时,该值是正值,当正方向的Z轴向着负方向的X轴旋转时,该值是负值。它的取值范围是90度到-90度之间。
这种定义有别与航空领域的偏航、倾斜和滚动,飞行器的X轴是飞机的长边(从尾部到头部)。另外,由于历史原因,顺时针方向的转角是正值(从数学的角度,逆时针方向应该是正值)。
方向传感器通过处理来自加速度传感器和地磁场传感器的原始数据来获取它的数据。因为要涉及到重力处理,所以方向传感器的精度和准确度会受到影响(特别是,这种传感器只在转角部分是0的时候才是可信赖的)。因为这种原因,在Android2.2(API Level 8)中弃用了这种传感器。使用来自方向传感器的原始数据来替代,我们推荐使用getRotationMatrix()方法跟getOrientation()方法相结合来计算方向值。你还能够使用remapCoordinateSystem()方法把方向值转换成你的应用程序的参照坐标系。
以下代码示例演示了如何从方向传感器中直接获取数据。我们只在忽略设备转角的前提下,才推荐使用这种方法:
publicclassSensorActivityextendsActivityimplementsSensorEventListener{
privateSensorManager mSensorManager;
privateSensor mOrientation;
@Override
publicvoid onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSensorManager =(SensorManager) getSystemService(Context.SENSOR_SERVICE);
mOrientation = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
}
@Override
publicvoid onAccuracyChanged(Sensor sensor,int accuracy){
// Do something here if sensor accuracy changes.
// You must implement this callback in your code.
}
@Override
protectedvoid onResume(){
super.onResume();
mSensorManager.registerListener(this, mOrientation,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protectedvoid onPause(){
super.onPause();
mSensorManager.unregisterListener(this);
}
@Override
publicvoid onSensorChanged(SensorEventevent){
float azimuth_angle =event.values[0];
float pitch_angle =event.values[1];
float roll_angle =event.values[2];
// Do something with these orientation angles.
}
}
通常,除了把该传感器的坐标系统转换成你应用程序的坐标系统之外,你不需要对来自方向传感器的原始数据进行任何的处理或过滤。Accelerometer Play示例程序演示如何把加速度传感器的数据转换到另外的一个坐标系统中。这与方向传感器所使用的技术是类似的,你可以参照这个示例程序。
使用地磁场传感器
地磁场传感器让你能够监视地球磁场的变化。下列代码显示了如何获取默认地磁场传感器实例:
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);
通常,距离传感器用于判断人的头部距离手持设备面板有多远(例如,用户拨打或接听电话时)。大多数距离传感器会返回一个绝对距离(以厘米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);
// 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);
}
}
注意:某些距离传感器返回代表“接近”或“远离”的二进制值。在这个实例中,通常传感器在“远离”状态中报告最大范围的值,在“接近”状态中报告较小的值。典型的远离值是>5cm,但不同的传感器也会有所不同。通过使用getMaximumRange()方法来判断传感器的最大范围。