У меня нет точного решения, но полнопроходное решение включает алгоритм TRIAD для объединения вектора из магнитометра (компаса) и акселерометра. Эта статья в Википедии подробно рассказывает о ней.
С концептуальной точки зрения лучший способ думать о проблеме состоит в том, что ваш вектор акселерометра представляет собой «вниз» и определяет плоскость, на которую указывает устройство. Наклон этого самолета даст вам «крен» и «тангаж». Затем вы можете использовать свой вектор магнитометра, чтобы определить, куда в этой плоскости указывает ваше устройство, и это даст вам «направление».
Надежное решение может быть реализовано с приличным набором библиотек векторов и матриц / кватернионов, но вы должны иметь возможность взломать что-то вместе с функциями триггера. Надеюсь, другой плакат уже сделал это.
РЕДАКТИРОВАТЬ: Нашли в Android-документах что-то, что обеспечивает то, что вы хотите. Вам необходимо получить Sensor объект TYPE_ORIENTATION из SensorManager . Это может обеспечить азимут, крен и шаг. Я не знаю, какие устройства предоставляют эту функцию.