我正在构建一个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 会返回完美的结果,但不幸的是,此方法已被弃用:
方法2 也会返回好的结果,但有时(随机)会返回不正确的程度:
如您所见,使用第二种方法随机返回一些不正确的度数。设备已经过校准,我认为问题在于第二种方法,因为第一种方法会返回完美的结果。你能帮助我吗?
答案 0 :(得分:3)
问题在于mGravity
和mGeomagnetic
的分配应该是event.values.clone()
。 mGravity具有类范围,但是,通过使用mGravity = event.values,可以将其值分配给具有方法范围的地址中的值。因此,只要再次调用onSensorChanged并且它是磁性类型,mGravity现在指向一个不再存在的变量,因此可以具有任何值。