2011-07-27 34 views

回答

7

传感器TYPE_MAGNETIC_FIELDTYPE_ACCELEROMETER很好地检测到(因为TYPE_ORIENTATION现在已被弃用)。

你将需要:

几个矩阵:

private float[] mValuesMagnet  = new float[3]; 
private float[] mValuesAccel  = new float[3]; 
private float[] mValuesOrientation = new float[3]; 

private float[] mRotationMatrix = new float[9]; 

一个监听器捕捉传感器发送的值(这将是SensorManager.registerListener()的说法,你将不得不调用设置您的传感器):

private final SensorEventListener mEventListener = new SensorEventListener() { 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
    } 

    public void onSensorChanged(SensorEvent event) { 
     // Handle the events for which we registered 
     switch (event.sensor.getType()) {   
      case Sensor.TYPE_ACCELEROMETER: 
       System.arraycopy(event.values, 0, mValuesAccel, 0, 3); 
       break; 

      case Sensor.TYPE_MAGNETIC_FIELD: 
       System.arraycopy(event.values, 0, mValuesMagnet, 0, 3); 
       break; 
    } 
}; 

你还需要计算方位,俯仰和横滚:

SensorManager.getRotationMatrix(mRotationMatrix, null, mValuesAccel, mValuesMagnet); 
    SensorManager.getOrientation(mRotationMatrix, mValuesOrientation); 

mValuesOrientation然后填充有:

  • mValuesOrientation[0]:方位角,绕Z轴的旋转。
  • mValuesOrientation[1]:俯仰,围绕X轴旋转。
  • mValuesOrientation[2]:滚动,围绕Y轴旋转。

检查documentation of getOrientation()以了解如何定义坐标轴。您可能需要使用SensorManager.remapCoordinateSystem()重新定义这些轴。

+0

这是完美的。谢谢。 – richard

+0

当我这样做时,音高永远不会达到180°。它从0°开始(平坦的,面向天空),然后在手机朝向我时移至90°,然后在朝向地面时移回90°。这是一种预期的行为?我怎么知道设备是在盯着天空还是地板呢? – Joan

0

这取决于你想检测什么,如果你想检测到手机已经在一个旋转中移动,那么加速计可能是你最好的选择。 如果你想检测到手机现在旋转,然后方向。