安卓无法获得指南针方向



我正在尝试使用SensorEventListener获取用户的磁性标题。可悲的是,在Android上,这个接缝有点麻烦。

在我的HTC上,我的读数相当准确。在我的三星Galaxy S3上,读数是完全随机的。我知道我的班级一定有问题,因为Play商店接缝的指南针应用程序工作得很好。

我的代码是:

public class HeadingSensor implements SensorEventListener {
private static final String LOG_TAG = "sw_HeadingSensor";
private SensorManager mSensorManager;
private long mLastHeadingUpdate;
private int mMinUpdateFrequency = 500;//milliseconds
private HeadingListener mCallback;
private float[] mGravity;
private float[] mGeomagnetic;
public interface HeadingListener {
    public void headingChanged(int heading);
}
public HeadingSensor(Context context, HeadingListener headingListener) {
    mCallback = headingListener;
    mSensorManager = (SensorManager)context.getSystemService(Context.SENSOR_SERVICE);
}
public void registerListener() {
    Log.d(LOG_TAG, "listener registered");
    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
    mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
}
public void unregisterListener() {
    Log.d(LOG_TAG, "listener unregistered");
    mSensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
    if (sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        mGravity = sensorEvent.values;
    }
    if (sensorEvent.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        mGeomagnetic = sensorEvent.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) {
            long currentTime = System.currentTimeMillis();
            if ((currentTime - mLastHeadingUpdate) > mMinUpdateFrequency) {
                mLastHeadingUpdate = currentTime;
                float orientation[] = new float[3];
                SensorManager.getOrientation(R, orientation);
                float azimuthInRadians = orientation[0];
                int azimuthInDegress = (int)(Math.toDegrees(azimuthInRadians) + 360) % 360;
                if (null != mCallback) {
                    mCallback.headingChanged(azimuthInDegress);
                }
            }
        }
    }
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { }
}

我已经阅读了尽可能多的教程、参考资料等,但我找不到获取指南针方向的好方法。有人可以告诉我这门课有什么问题吗?

你应该使用TYPE_GRAVITY而不是TYPE_ACCELEROMETER否则你应该低通滤波器TYPE_ACCELEROMETER。你的问题主要在于

mGravity = sensorEvent.values;

mGeomagnetic = sensorEvent.values;

由于 sensorEvent 是一个局部变量,并且 mGravitymGeomagnetic 指向此值,因此在下次调用 onSensorChanged 时,这些变量中的任何一个都可以是任何值。它应该是

mGravity = sensorEvent.values.clone();

mGeomagnetic = sensorEvent.values.clone();

你可以看看我的答案 Android getOrientation当手机倾斜时方位角被污染

最新更新