Как получить направление на 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); 

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