Правильно ли зарегистрирована камера CameraInfo.orientation? Неправильно реализовано?

В Android вы можете получить описание свойств Camera, извлекая CameraInfo. Меня интересует ориентация, как описано в http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation

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

В частности, в документации говорится:

Значение - это угол, в котором изображение камеры должно вращаться по часовой стрелке, чтобы он отображался правильно на дисплее в естественном ориентации.... Например, предположим, что устройство имеет естественный высокий экран. Обратный датчик камеры монтируется в ландшафтном режиме. Вы глядя на экран. Если верхняя сторона датчика камеры выровнена с правым краем экрана в естественной ориентации, значение должно быть 90. Если верхняя сторона переднего датчика камеры выровненный справа от экрана, значение должно быть 270.

Но в заявленном примере изображение камеры поворачивается на 90 градусов по часовой стрелке относительно естественной высокой ориентации, а не наоборот. То есть изображение, верхняя часть которого выровнена с правой стороны устройства, требует 270 градусов по часовой стрелке для выравнивания с верхней стороной устройства.

По крайней мере, все четыре из моих устройств сообщают "90" для этого значения, и все действуют так, как будто верх камеры является правой стороной устройства, когда он удерживается в естественной ориентации. То есть изображение должно поворачиваться на 270 градусов по часовой стрелке, а не на 90, чтобы соответствовать естественной ориентации. Пример кажется правильным; в первой строке нет.

Этот примерный код, похоже, подтверждает мой вывод, поскольку он дает только правильный результат, когда ориентация интерпретируется, как указано выше.

Как ни странно, у меня есть данные журналов с одного пользовательского устройства, которое показывает, что оно сообщает это значение как 90 раз и 0 в другое время! Это должно быть физическое свойство того, как камера находится в устройстве, не так ли?

  • Может ли кто-нибудь подтвердить, что первая строка документации на самом деле неверна, и пример верен?
  • Кто-нибудь заметил изменение значения CameraInfo.orientation? Есть ли доказательства в документах, что это юридическое поведение, или это, вероятно, ошибка в устройстве?
  • Любые другие связанные комментарии, опыты, gotchas Я еще не наткнулся?

Ответ 1

1) Может ли кто-нибудь подтвердить, что первая строка документации на самом деле неверно, и пример правильный?

Вы полностью обратились к этому уже в своем ответе, спасибо за последующее объяснение!

2) Кто-нибудь заметил изменение значения CameraInfo.orientation? Существуют ли в документах доказательства того, что это правовое поведение, или, скорее всего, это ошибка в устройстве?

В то время как я могу легко представить, что это будет ошибкой в ​​принципе, это все равно будет довольно серьезным, затрагивающим всевозможные приложения, связанные с изображениями, из-за того, что полученная информация будет внедрена через EXIF ​​на фотографиях (например, связанные с EXIF ​​ошибки в сторону на мгновение).

Таким образом, я считаю более вероятным фактическую функцию одной из этих тысяч устройств Android, например, камеру с возможностью физического поворота объектива. Хотя в настоящее время я не знаю о Android, основанной на Android, раньше были такие телефоны, например. LG VX7000 (~ 2004) или Samsung SCH-a930 (~ 2006) (см., например, Rotating Camera Lens в руководстве), поэтому я не удивлюсь, если что-то подобное появится в сфере Android.

Кстати, есть неотвеченный вопрос. Почему мои картинки перевернуты или назад. в Вопросы и ответы клиентов для Samsung SCH-A930 относительно последнего:

В последнее время мои фото были перевернуты или назад. Почему это и как я могу это исправить.

На самом деле это может быть ошибка в используемом в противном случае аппарате/прошивке для настройки вращения;)

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

Ответ 2

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

Пример правильный. И текст на самом деле правильный. В данном примере, если данные предварительного просмотра отображаются на экране, он будет поворачиваться на 90 градусов против часовой стрелки, так как "вверх" в данных находится на дисплее справа, и он отображается на дисплее, чей "вверх" "по данным левой руки, так сказать. Таким образом, необходимо было бы компенсировать вращением данных изображения на 90 градусов по часовой стрелке перед отображением.

Я считаю более естественным понимать эту цифру как поворот, на котором камера установлена ​​относительно естественной ориентации.

По этим причинам и другим я пришел к выводу, что устройство, которое показывает изменяющееся значение для ориентации, просто глючит. По крайней мере, когда он сообщает 0, его данные действуют как "90" - это правильное значение.

Ответ 3

Другим способом решения проблемы является расширение OrientationEventListener и переопределить метод onOrientationChanged, вы получите ориентацию вашего телефона, даже отключенный авторотат (поскольку слушатель испускает событие поворота через датчик).

вы должны включить и отключить прослушиватель ориентации onResume/onPause, чтобы предотвратить утечку аккумулятора.

    private class OnOrientationChange extends OrientationEventListener {
    private boolean isEnabled = false;

    public OnOrientationChange(Context context) {
        super(context);
        disable();
    }

    @Override
    public void onOrientationChanged(int orientation) {
        if (camera != null && orientation != ORIENTATION_UNKNOWN) {
            int newOutputOrientation = getCameraPictureRotation(orientation);

            if (newOutputOrientation != outputOrientation) {
                outputOrientation = newOutputOrientation;

                Camera.Parameters params = camera.getParameters();

                params.setRotation(outputOrientation);

                try {
                    camera.setParameters(params);
                    lastPictureOrientation = outputOrientation;
                } catch (Exception e) {
                    Log.e(getClass().getSimpleName(),
                            "Exception updating camera parameters in orientation change",
                            e);
                    // TODO: get this info out to hosting app
                }
            }
        }
    }

    @Override
    public void enable() {
        isEnabled = true;
        super.enable();
    }

    @Override
    public void disable() {
        isEnabled = false;
        super.disable();
    }

    boolean isEnabled() {
        return (isEnabled);
    }
}

спасибо за общепринятое решение для решения