2013-03-25 88 views
2

我正在構建一個Android設備應用程序,它將設備指南針的度數記錄到一個文件中。有兩種方法得到這個度:Android磁力計返回隨機值

方法1:

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
Sensor orientationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); 
mSensorManager.registerListener(this, orientationSensor, SensorManager.SENSOR_DELAY_NORMAL); 


public void onSensorChanged(SensorEvent event) { 
    float azimuthInDegrees = event.values[0] 
} 

方法2:

SensorManager mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
Sensor accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
Sensor magnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
mSensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
mSensorManager.registerListener(this, magnetometer, SensorManager.SENSOR_DELAY_NORMAL); 

float[] mGravity; 
float[] mGeomagnetic; 

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     mGravity = event.values; 
    } 


    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) { 
     mGeomagnetic = event.values; 
    } 

    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 
     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 

      float azimuthInDegress = ((float) Math.toDegrees(orientation[0]) + 360) % 360; 
     } 
    } 
} 

我放置我的設備在北方方向嘗試了兩種方法(大約360度):

方法1回報完美的效果,但遺憾的是這種方法已經過時:

  • 359.6567
  • 359.5034
  • 359.859
  • 359.76212
  • 359.8878
  • 359.87048
  • 359.8356
  • 359.80356
  • 359.81192
  • 359.7671
  • 359.84668
  • 359.88528

方法2也返回良好的結果,但有時(隨機地),它返回一個不正確的程度:

  • 359.91495
  • 359.83652
  • 263.67697
  • 359.67993
  • 359.70038
  • 359.688
  • 359.71155
  • 359.70276
  • 359.6984
  • 359.6429
  • 270.6323
  • 359.62302
  • 359.49954
  • 359.44757
  • 359.47803
  • 359.4947
  • 359.39572

正如你所看到的,一些不正確的程度是隨機與第二種方法返回。該設備進行了校準,我認爲問題在於第二種方法,因爲第一種方法會返回完美結果。你們能幫我嗎?

+0

什麼位置是設備,當你得到這些結果。例如直接拿着設備 – 2013-03-25 18:59:28

+0

我握着它在我的手中。幾乎平坦 – user1135357 2013-03-25 19:02:00

+0

只需更改? = event.values到event.values.clone(),看看你是否仍然有相同的行爲。 – 2013-03-25 19:07:53

回答

3

問題在於mGravitymGeomagnetic的分配應該是event.values.clone()。 mGravity具有類作用域,但通過使用mGravity = event.values,可以將其值賦給具有方法作用域的地址中的值。因此,只要再次調用onSensorChanged並且它是磁性類型,則mGravity現在指向一個不再存在的變量,因此可以具有任何值。