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