Получить поворот и отображение в градусах

Мне нужно что-то очень простое, но я не мог найти подходящий пример для изучения. Моя единственная цель заключается в следующем:


Поскольку устройство размещено на столе (плотно) на столе, оно должно показывать 0 (или близко к 0) для оси X и Y. Когда я поднимаю его из верхней части (где находится динамик), а нижняя часть (где находится микрофон) остается подавленной – она ​​должна показывать мне, сколько градусов телефон наклонен. Математически описывается – показывать в градусах угол между задней частью телефона и столом для одной из осей. Когда я поднимаю нижнюю часть (и верхняя часть остается подавленной), тогда показывайте минус градусы.

То же самое касается другой оси – поворот телефона вокруг его длинных сторон.


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

Может ли кто-нибудь дать мне пример функции onSensorChanged (так как вся работа продолжается здесь) и просто скажите мне, какой датчик используется, поэтому я знаю, что регистрировать?

Solutions Collecting From Web of "Получить поворот и отображение в градусах"

В Интернете есть несколько примеров и руководств, но будьте осторожны. Sensor.TYPE_ORIENTATION устарела. Вам необходимо вычислить вращения, прослушивая эти два датчика Sensor.TYPE_ACCELEROMETER и Sensor.TYPE_MAGNETIC_FIELD .

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

 public void onSensorChanged(SensorEvent event) { if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) mGravity = event.values; if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) mGeomagnetic = event.values; if (mGravity != null && mGeomagnetic != null) { float R[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimut = orientation[0]; // orientation contains: azimut, pitch and roll pitch = orientation[1]; roll = orientation[2]; } } } 

Именно так вы должны вычислять азимуты, высоты тона, значения рулона вашего устройства в onSensorChanged(SensorEvent event) . Имейте в виду, что «все три угла выше находятся в радианах и положительны в направлении против часовой стрелки». Вы можете просто преобразовать их в градусы с помощью Math.toDegrees()

Как отметил Луис САПР в комментариях, рекомендуется переместить инициализацию массивов I, R и ориентации из обратного вызова onSensorChanged, так как он часто называется. Создание, а затем оставление их для GC плохо для производительности ваших приложений. Я оставил его там для простоты.

На основе того, как ваше устройство повернуто, вам может понадобиться переназначить координаты, чтобы получить желаемый результат. Вы можете узнать больше о remapCoordinateSystem а также о getRotationMatrix и getOrientation в документации по Android

Пример кода: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html