Я использую датчики силы тяжести и магнитного поля Android для расчета ориентации с помощью SensorManager.getRotationMatrix и SensorManager.getOrientation. Это дает мне азимут, шаг и ориентировочные числа. Результаты выглядят разумно, когда устройство лежит на столе.
Однако я отключил переключатели между портретом и пейзажем в манифесте, так что getWindowManager(). getDefaultDisplay(). getRotation() всегда равен нулю. Когда я поворачиваю устройство на 90 градусов, чтобы он стоял вертикально, я сталкивался с проблемой. Иногда цифры кажутся совершенно неправильными, и я понял, что это относится к Gimbal lock. Однако у других приложений, похоже, нет этой проблемы. Например, я сравнил свое приложение с двумя бесплатными тестовыми приложениями для датчиков (Sensor Tester (Dicotomica) и Мониторинг датчиков (R Software)). Мое приложение соглашается с этими приложениями, когда устройство плоское, но при повороте устройства в вертикальное положение могут быть значительные различия. Кажется, что оба приложения согласны друг с другом, так как они обошли эту проблему?