Это CameraInfo Андроида.ориентация правильно задокументирована? Неправильно реализовано?

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

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

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

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

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

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

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

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

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

3 ответов


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

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

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

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

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

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

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

на самом деле это может быть ошибка в Иначе функционирующем аппаратном/микропрограммном обеспечении регулировки вращения ;)


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

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

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

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


другой способ справиться с проблемой-расширить 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);
    }
}

спасибо за common-sware для решения