Как получить направление в Android (например, север, запад) - PullRequest
7 голосов
/ 29 ноября 2011

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

Ответы [ 4 ]

8 голосов
/ 14 апреля 2014

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);
1 голос
/ 07 августа 2016

Вот то, что у меня пока получилось, это несколько работает для меня, возвращаемые значения находятся в диапазоне от 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);

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

1 голос
/ 29 ноября 2011

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

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

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

0 голосов
/ 30 ноября 2018

Используйте датчик вектора вращения, который объединяет геомагнитные и гравитационные датчики.Затем используйте SensorManager.getOrientation , чтобы преобразовать массив из 5 значений в матрицу вращения.Как сказано в документации, первое значение - это ориентация компаса в радианах.

var positionDegrees = Float.NaN

override fun onSensorChanged(event: SensorEvent?) {
    if (event?.sensor?.type == Sensor.TYPE_ROTATION_VECTOR) {
         val rotationMatrix = FloatArray(9)
         SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector)
         val orientationValues = FloatArray(3)
         positionDegrees = azimuthToDegrees(mValuesOrientation[0])
    }
}

/** Convert such that North=0, East=90, South=180, West=270. */
fun azimuthToDegrees(azimuth: Float): Float {
    return ((Math.toDegrees(azimuth.toDouble())+360) % 360).toFloat()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...