Почему мне нужно встряхнуть телефон, чтобы получить правильные "Компас-данные"?
У меня небольшая проблема с "Компасом".
Я хочу показать на экране, в каком направлении я смотрю с камерой. Для этого у меня есть 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(), предоставляющий правильную информацию о состоянии датчика.