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

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

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

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

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

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

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

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

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

Solutions Collecting From Web of "API-интерфейс камеры: проблемы с перекрестными устройствами"

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

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

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

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

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

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

Коррекция AR

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

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

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

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

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

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

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