java - manejo - Camera API: problemas de dispositivos cruzados
onactivityresult camera android (3)
Consulte esta publicación sobre cómo cambiar el escáner QR para que sea vertical: http://code.google.com/p/zxing/issues/detail?id=178 . No sé si se relaciona con el intercambio de la imagen para que sea un retrato, pero tal vez proporcione alguna orientación. El comentario # 11 parece ser el más útil. (No estoy respaldando que el código de la aplicación QR sea robado por Sean Owen).
Estoy desarrollando una aplicación de cámara básicamente como parte de una aplicación de mensajería para adjuntar imágenes, etc. La aplicación necesita funcionar para> = SDK 2.2 y:
No puedo usar la cámara Android predeterminada tanto como me gustaría porque:
La naturaleza de la aplicación dicta que la imagen no se debe guardar en el disco nunca y algunos fabricantes de equipos originales (Samsung) adoran hacer esto sin darle una opción.
No puedo llamar a un intento que cualquier otra aplicación de cámara pueda interceptar porque entonces esa aplicación podría guardar la imagen.
Mi problema actual es lidiar con el hecho de que la cámara Android aparentemente odia estar en orientación vertical. Específicamente, después de excavar, estoy monitoreando la pantalla y, en rotación, llamando a setDisplayOrientation(90)
. Esto funciona, pero las dimensiones de la superficie también deben modificarse y esto debe hacerse dentro de las dimensiones admitidas o la configuración del parámetro bloquea la aplicación.
Estoy haciendo esto con otro fragmento SO que encontré aquí (el método getBestPreviewSize()
) pero tiene un problema flagrante que no puedo creer que no haya encontrado a nadie más.
Parte del ciclo de vida takePicture
consiste en llamar a la devolución de llamada de imagen Postview. Esto es lo que muestra la imagen fija de la imagen SurfaceView
pausa actual que se devolverá a través de byteArray a la devolución de llamada en bruto y / o jpeg. Mi problema es que esta imagen todavía está sesgada en un puñado de dispositivos de prueba aparentemente aleatorios. Entonces, el comportamiento es que el usuario ve una imagen dinámica de la cámara en una relación de aspecto 4: 3 perfecta hasta que toman la fotografía y la imagen con la que se presentan queda aplastada. Tenga en cuenta que la matriz de bytes en sí es correcta y cuando construyo el Bitmap
de Bitmap
en el punto final de la mensajería, aparece bien, pero esto sigue siendo un problema.
No puedo ver cómo puedo alterar la visualización de la imagen fija en este punto. Puede alguien ayudarme con esto?
El sistema de cámara Android es un desastre. Y soldado a la placa base, el chip de la cámara no le va a gustar la aplicación portait - todas las devoluciones de datos derraman datos en la orientación de la cámara (el búfer que recibe es en realidad una pieza de memoria compartida con la aplicación de cámara nativa) - si desea mostrarlo mientras su aplicación está en modo retrato, tendrá que voltear esta información sobre xy
.
En lugar de mostrar una imagen en la vista de superficie utilizada por la cámara, la superponía con ImageView
transparente y dibujaba mi mapa de bits allí.
Puede (con suerte) encontrar algo de inspiración en el proyecto javaocr donde el deamon de Android funciona en modo vertical y dibuja mapas de bits sobre la vista previa en vivo. (Por favor, compruebe desde git
, ya que se está lanzando ahora y estoy luchando con git y maven, vea el directorio demos)
Sospecho que tu problema está en un par de niveles diferentes.
Montaje del sensor
En primer lugar, el sensor de la cámara está montado diferente en cada dispositivo. Google tiene un código de placa de caldera para obtener esa orientación y establecer el valor de rotación correcto para corregirlo aquí y está bien hasta la API 8.
Corrección AR
El segundo problema es, obviamente, que los marcos de vista previa no tienen la misma relación de aspecto que la pantalla. Puedes usar esta publicación para resolver eso. Las dimensiones de la vista de superficie no tienen relación con el mejor tamaño de vista previa, esos valores no tienen que coincidir; de hecho, que su AR esté dañado demuestra que no coinciden.
Vista previa del tamaño del marco! = Tamaño de la imagen
Finalmente, cuando toma una fotografía con takePicture, el tamaño de la imagen es completamente independiente del tamaño de su marco de vista previa. Utilice lo siguiente para consultar y configurar el tamaño de marco de vista previa: setPreviewSize () / getSupportedPreviewSizes ()
Utilice lo siguiente para consultar y establecer el tamaño de la imagen (desde takePicture ()): getSupportedPictureSizes () / setPictureSize ()
Algunos dispositivos con los que puede tener suerte y los valores predeterminados para imágenes y marcos de vista previa serán los mismos. Este no es el caso en todos los dispositivos.
Por último, si desea visualizar la imagen tomada, es posible que también necesite hacer una corrección AR si no tiene el mismo tamaño que su SurfaceView. Alternativamente, podría dibujarlo en una ImageView y usar ScaleType.CENTER_INSIDE para preservar la relación de aspecto.