2011-07-27 36 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

這取決於你想檢測什麼,如果你想檢測到手機已經在一個旋轉中移動,那麼加速計可能是你最好的選擇。 如果你想檢測到手機現在旋轉,然後方向。