Intereting Posts
Использование сканера штрих-кода на виртуальном устройстве Android Как использовать ресурс Idluso Idling Как отображать только один вход в систему, а затем после запуска приложения непосредственно в android Является ли ошибка Android в макете «layout-ldltr» в отношении «layout-ldrtl» после изменения ориентации? Можно ли показать / скрыть маркеры в Android Google maps api v2? FragmentActivity, вызывающая ClassNotFoundException Принудительный выход звука на внутренний динамик, когда наушники подключены Использование ActionBarSherlock с новой поддержкой SupportMapFragment Метод переопределения, но параметр arg0 Не удалось решить: com.android.support:appcompat-v7:25.1.0 Как обновить импортированный модуль в Android Studio? AsyncTask.doInBackground не получает вызов 2.3, работая с 4.0+ Правильное использование yieldIfContendedSafely () в многопоточном приложении Android Android java.security.cert.CertPathValidatorException: целевой привязку для пути сертификации не найден Универсальное приложение (планшет и телефон) – как лучше всего структурировать – несколько макетов xml или показать / скрыть виджеты?

Как получить направление на Android (например, Север, Запад)

Я новичок в Android, и я хочу получить направление в соответствии с моей камерой. Как я могу получить информацию о направлении в соответствии с моей камерой? Не могли бы вы дать идею?

TYPE_ORIENTATION устарела

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

Вот пример компаса : http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

Преобразование из акселерометра и магнитного поля в азимут :

float[] mGravity; float[] mGeomagnetic; 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]; if (SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic)) { // orientation contains azimut, pitch and roll float orientation[] = new float[3]; SensorManager.getOrientation(R, orientation); azimut = orientation[0]; } } } 

Чтобы указать север, вы можете рассчитать поворот в градусах:

 float rotation = -azimut * 360 / (2 * 3.14159f); 

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

Пример компаса

Также проверьте Sensor.TYPE_ORIENTATION на этой странице.

Вот что я до сих пор, что несколько работает для меня, возвращаемые значения находятся между 0 – 360, но я не думаю, что север должным образом откалиброван? Я использую это на LG G Pad под управлением Android 5.0.1

 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 outR[] = new float[9]; float I[] = new float[9]; boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); if (success) { float orientation[] = new float[3]; SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, SensorManager.AXIS_Y, outR); SensorManager.getOrientation(outR, orientation); azimut = orientation[0]; float degree = (float)(Math.toDegrees(azimut)+360)%360; System.out.println("degree " + degree); 

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