Подтвердить что ты не робот

API-интерфейс камеры: проблемы с перекрестными устройствами

Я разрабатываю приложение для камеры в основном как часть приложения для обмена сообщениями для прикрепления изображений и т.д. Приложение должно работать для >= SDK 2.2 и:

Я не могу использовать камеру Android по умолчанию, насколько мне бы хотелось, потому что:

  • Характер приложения диктует, что изображение не должно сохраняться на диске, и некоторые OEM-производители (Samsung) любят делать это, не давая вам выбора.

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

Моя текущая проблема связана с тем, что камера Android, по-видимому, ненавидит себя в портретной ориентации. В частности, после некоторого копания я контролирую дисплей и, при вращении, вызываю setDisplayOrientation(90). Это работает, но размеры поверхности также необходимо изменить, и это должно быть сделано в поддерживаемых размерах или параметр отключает приложение.

Я делаю это с другим фрагментом SO, который нашел здесь (метод getBestPreviewSize()), но у него есть одна вопиющая проблема, в которой я не могу поверить, что я Не нашел никого другого.

Часть жизненного цикла takePicture включает вызов обратного вызова изображения PostView. Это показывает неподвижное изображение текущего приостановленного изображения SurfaceView, которое будет возвращено через byteArray для обратного вызова raw и/или jpeg. Моя проблема в том, что этот образ все еще искажен на нескольких, казалось бы, случайных тестовых устройствах! Таким образом, поведение - это то, что пользователь видит динамическое изображение камеры в идеальном соотношении сторон 4: 3 до тех пор, пока они не сделают снимок, и изображение, которое они представляют, зажато. Обратите внимание, что сам массив байтов является правильным, и когда я создаю Bitmap в конечной точке обмена сообщениями, он отображается нормально, но это все еще проблема.

Я не вижу, как я могу изменить отображение неподвижного изображения в этот момент. Может ли кто-нибудь помочь мне с этим?

4b9b3361

Ответ 1

Android-камера - это беспорядок. И, если вы припаиваете к материнской плате, чип камеры не понравится приложению portait - все обратные вызовы выведут данные в ориентации камеры (буфер, который вы получаете, является фактически разделяемой памятью с собственным приложением для камеры) - если вы хотите отображать его, пока приложение в режиме portait вам придется перевернуть эти данные поверх xy.

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

Вы можете (надеюсь) найти вдохновение в проекте javaocr, где андроид-деамон работает в портретном режиме и рисует растровые изображения в режиме предварительного просмотра. (пожалуйста, закажите от git, поскольку он выпущен сейчас, и я боюсь с git и maven, см. каталог demos)

Ответ 2

Я подозреваю, что ваша проблема находится на разных уровнях.

Крепление датчика

Во-первых, датчик камеры установлен на каждом устройстве. У Google есть код плиты котла для получения этой ориентации и установки правильного значения поворота, чтобы исправить его здесь, и это хорошо для API 8.

Коррекция AR

Вторая проблема, очевидно, заключается в том, что кадры предварительного просмотра не совпадают с соотношением сторон экрана. Вы можете использовать эту почту, чтобы решить эту проблему. Размеры поверхности не имеют никакого отношения к максимальному размеру предварительного просмотра, эти значения не должны совпадать - на самом деле, ваш AR испорчен, это доказывает, что они не совпадают.

Предварительный размер кадра!= Размер изображения

Наконец, когда вы делаете снимок с использованием takePicture, размер изображения полностью не зависит от размера вашего кадра предварительного просмотра. Для запроса и установки размера кадра предварительного просмотра используйте следующее: setPreviewSize()/getSupportedPreviewSizes()

Используйте следующее, чтобы запросить и установить размер изображения (из takePicture()): getSupportedPictureSizes()/setPictureSize()

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

Наконец, если вы хотите отобразить сделанное изображение, вам может потребоваться сделать коррекцию AR на нем, если он не такой же, как у SurfaceView. В качестве альтернативы вы можете нарисовать его в ImageView и использовать ScaleType.CENTER_INSIDE, чтобы сохранить соотношение сторон.

Ответ 3

Ознакомьтесь с этой публикацией о том, как переключить QR-сканер на портрет: http://code.google.com/p/zxing/issues/detail?id=178. Я не знаю, связано ли это с вашей заменой изображения на портрет, но, возможно, это дает некоторые рекомендации. Комментарий № 11 представляется наиболее полезным. (Я не утверждаю, что код QR-приложения будет сорван с Шона Оуэна).