为什么我需要摇动手机才能获得正确的“指南针数据”?

3
我对“指南针”有些问题。
我想在屏幕上显示我使用相机拍摄的方向。为此,我有一个CameraView和一个运行在横屏模式下的Activity
现在我尝试使用传感器获取方向,但出了些问题。当我启动应用程序时,它显示一些奇怪的数据,但是在摇晃手机后它会显示正确的数据?!
也许你可以帮助我。这是我的onSensorChanged方法:
public void onSensorChanged(SensorEvent event) {

    int type = event.sensor.getType();
    if (type == Sensor.TYPE_ACCELEROMETER) {
        mGrav = event.values.clone();
    } else if (type == Sensor.TYPE_MAGNETIC_FIELD) {
        mMag = event.values.clone();
    }

    if (SensorManager.getRotationMatrix(mRinn, null, mGrav, mMag)) {
        SensorManager.remapCoordinateSystem(mRinn, SensorManager.AXIS_X, SensorManager.AXIS_Z, mRout);

        SensorManager.getOrientation(mRout, mOrient);

        //Logger.d("direction?: " + Math.toDegrees(mOrient[0]));
        setOrientationText(Math.toDegrees(mOrient[0]));
    }
}

我正在获取两个传感器(磁力计和加速度计)的数据,然后创建旋转矩阵(如文档所示)。如果是横屏,我将 X -> X 轴和 Y -> Z 轴放入旋转矩阵中。
该活动的屏幕方向也是横屏。
但是我真的不明白为什么只有在摇动手机后才能获得正确的数据?!

1
非常好的问题,Mirko。不太有用的答案是“指南针需要校准”。在我的手机上,有一个电话键盘序列,可以将其置于测试模式下,在那里它可能会告诉我指南针需要校准。我也非常想知道它基于什么原因做出这个决定。 - NickT
我以为只有iPhone用户才会像摇晃玩具车一样摇动手机。它真的需要校准吗?难道不是“磁性”的吗?我觉得当我摇动手机时,屏幕的方向会改变(从竖屏变成横屏),但我不确定,因为我没有将任何东西调整到横屏模式... - Informatic0re
我找到了一个属性条目来校准G-Sensor,但是它没有起作用。指南针应该始终显示北方 :) - Informatic0re
这是一个有趣的问题,Mirko。我不是Android专家。但我玩过2轴芯片。它们可以在不改变方向(摇晃)的情况下进行正确的方位测量。我想知道你的指南针操作原理是否有特殊性。我想邀请您的问题加入一个专门讨论传感器的群组:http://tech.groups.yahoo.com/group/sensorforum - Nick Alexeev
一个朋友告诉我,地图应用程序中的传感器也需要校准(我从未注意到)。也许我需要保存校准后的指南针状态?我不知道如何做,但也许这是必要的,因为每次启动此应用程序时都需要重新校准。 - Informatic0re
1个回答

0

我认为这是与传感器初始化相关的问题。你可以看看我在类似问题上的回答。

简而言之:

某些轴的读数为零(两个轴或仅一个轴)。当您刚启用传感器(registerListener())时出现此问题,我认为它与某种传感器初始化有关。对于加速度传感器,我观察到只需轻微晃动设备即可开始提供正确的传感器读数。

正确的解决方法是onAccuracyChanged()方法提供有关传感器状态的正确信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接