Почему мне нужно встряхнуть телефон, чтобы получить правильные "Компас-данные"?

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

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

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

Короче:

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

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

Другие вопросы по тегам