Почему мне нужно встряхнуть телефон, чтобы получить правильные «Компас-данные»? - PullRequest
3 голосов
/ 25 ноября 2011

У меня небольшая проблема с «Компасом».

Я хочу показать на экране, в каком направлении я смотрю с камерой.Для этого у меня есть 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]));
    }
}

Я получаю данные двух датчиков (магнит и ускоритель), а затем создаю RotationMatrix (как сказано в документации).В случае, если это альбомная ориентация, я помещаю X -> Ось X и Y -> Ось Z для RotationMatrix.

Экранная ориентация для этого действия также является альбомной.Понимаете, почему я получаю правильные данные только после встряхивания телефона?!

1 Ответ

0 голосов
/ 06 декабря 2011

Я думаю, что это проблема, связанная с инициализацией датчиков. Вы можете видеть, что я ответил на подобный вопрос .

Короче говоря:

Показания равны нулю для некоторой оси (два или иногда только один). Эта проблема возникает, когда вы только что включили датчики (registerListener ()) и я предполагаю, что это связано с каким-то инициализация датчика. В случае с датчиком ускорения у меня есть заметил, что только небольшое встряхивание устройства заставляет его начать дать правильные показания датчика.

Правильным решением будет метод onAccuracyChanged (), дающий правильная информация о состоянии датчика.

...