Это 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 в другое время! Это должно быть физическое свойство, как камера сидит в устройство?
- может ли кто-нибудь подтвердить, что первая строка документации на самом деле неверна, и пример правильный?
- кто-нибудь заметил изменение значения
CameraInfo.orientation
? Есть ли доказательства в документах, что это законное поведение, или это, вероятно, ошибка в устройстве? - любые другие замечания, опыт, 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 для решения