我正在构建一个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号
如您所见,第二种方法随机返回一些不正确的度数。设备已经校准,我认为问题在于第二种方法,因为第一种方法返回了完美的结果。你们能帮我吗?

最佳答案

问题在于mGravity的分类,而mGeomagnetic应该是event.values.clone()。mgravity具有类作用域,但通过使用mgravity=event.values,可以将其值赋给具有方法作用域的地址中的值。所以一旦感测器被再次调用并且它是磁性类型,M重力现在指向一个不再存在的变量,因此可以有任何值。

10-07 12:40