2012-10-04 25 views
14

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 tiene que trabajar para> = 2.2 SDK y:Cámara: Dispositivo de Cruz emite

I no puede utilizar la cámara por defecto de Android tanto como me gustaría porque:

  1. la naturaleza de la aplicación dicta que la imagen no debe ser guardado en el disco nunca y algunos fabricantes de equipos originales (Samsung) encanta hacer esto sin dar usted una elección.

  2. 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 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 al setDisplayOrientation(90). Esto funciona pero las dimensiones de la vista superficial también deben modificarse y esto debe hacerse dentro de las dimensiones admitidas o la configuración de los parámetros bloquea la aplicación.

Estoy haciendo esto con otro fragmento SO Encontré here (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 al PostView devolución de llamada de imagen. Esto es lo que muestra la imagen fija de la imagen en pausa actualmente SurfaceView 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 en el punto final de la mensajería, aparece bien, pero esto sigue siendo un problema.

No veo cómo puedo alterar la visualización de la imagen fija en este momento. Puede alguien ayudarme con esto?

+0

¿Podría conservar la devolución de llamada de la foto posterior y mostrarla cuando se toma una foto? ¿Podría al final crear un mapa de bits a partir de los datos de la imagen tomada y mostrarlo en lugar de los datos de la imagen de la vista posterior? Supongo que todo se reduce a si los datos de la imagen final están en mal estado o si la vista de la superficie muestra algún cambio en su forma. –

Respuesta

6

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 pieza de memoria compartida con la aplicación de cámara nativa) - si desea mostrarlo mientras su aplicación está en modo retrato, deberá voltear esta información a través de xy.

En lugar de mostrar la imagen en la vista de superficie utilizada por la cámara, la superpongo con ImageView transparente y dibujo allí mi mapa de bits.

Puede (con suerte) encontrar algo de inspiración en javaocr project donde android deamon funciona en modo vertical y dibuja mapas de bits en la vista previa en vivo. (Por favor, aguarde desde git, ya que se está lanzando ahora y estoy luchando con git y maven, vea el directorio demos)

+0

Terminé 'resolviendo' este último viernes haciendo exactamente eso, construyendo un mapa de bits y mostrándolo. Estaba tratando de evitar esto ya que mi aplicación ya es bastante intensiva y todos sabemos acerca de los problemas de asignación de mapas de bits nativos de Android anteriores a la 3.0. Pero estoy divagando ... Gracias por tomarse el tiempo para publicar –

+0

Asegúrese de que está configurando las opciones de BitmapFactory enSampleSize. Ayuda a un TON con esos problemas de memoria. – samuelesque

0

Consulte esta publicación sobre cómo cambiar el escáner QR para que sea portrait: 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).

3

Sospecho que su problema está en un par de niveles diferentes.

montaje del sensor

primer lugar, el sensor de la cámara está montada diferente en cada dispositivo. Google tiene el código de placa de la caldera para conseguir que la orientación y estableciendo el valor de rotación correcta para corregirlo here y es bueno hasta API 8.

AR Corrección

La segunda cuestión es, obviamente, que los cuadros de vista preliminar aren No es la misma relación de aspecto que la pantalla. Puede usar la publicación this 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.

Tamaño de vista previa del marco = Tamaño de la imagen

Por último, cuando se 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 la siguiente para consultar y establecer el tamaño del marco de vista previa: setPreviewSize()/getSupportedPreviewSizes()

Utilice la siguiente para consultar y establecer el tamaño de la imagen (de takePicture()): getSupportedPictureSizes()/setPictureSize()

Algunos dispositivos se puede conseguir afortunado y los valores predeterminados para las imágenes y los marcos de vista previa serán los mismos. Este no es el caso en todos los dispositivos.

Finalmente, si desea visualizar la imagen tomada, es posible que tenga que hacer una corrección de AR si el mismo no es del mismo tamaño que su SurfaceView. Alternativamente, podría dibujarlo en un ImageView y usar ScaleType.CENTER_INSIDE para preservar la relación de aspecto.