Últimamente he estado enredando un poco con el SDK de Android y me he encontrado con esos pequeños detalles que hay que tratar con cuidado.
La vista previa de la cámara de fotos en Android es una sencilla tarea que requiere unos sencillos pasos en principio, pero que se puede complicar debido a pequeños detalles que hay que tener en cuenta.
Las aplicaciones en android están compuestas de pantallas llamadas Activity. Se puede pensar en los activity como el equivalente al form en una aplicación de escritorio. Un activity es una pantalla con una serie de controles que realiza una actividad concreta.
Lo bueno de esta estructura es que cualquier aplicación puede publicar sus activity de modo que otra pueda hacer uso de ella. Por ejemplo, desde una aplicación que muestre una lista de contactos del móvil se puede abrir el activity del teléfono para realizar una llamada.
De este modo si estás desarrollando una aplicación que requiere realizar una foto, parece interesante usar la propia aplicación de fotografías que traiga el sistema. Hasta aquí todo bien hasta que te pones manos a la obra.
Resulta que cuando le pides al activity de la aplicación de cámara que haga una foto, la resolución de la foto que devuelve no puedes especificarla, sino que te tienes que apañar con lo que haga. Hay que tener en cuenta que mi HTC Hero actualmente tiene android 1.5 y que estos temas están mejor tratados en versiones posteriores de android, pero las aplicaciones que hago han de funcionar al menos en mi teléfono.
Según la documentación si se añade un atributo EXTRA_OUTPUT se devuelve la imagen a resolución completa, y si no, se devuelve una imagen pequeñita. La realidad es distinta, ya que con el atributo de EXTRA_OUTPUT se recibe una imagen de 512x384px, al menos en algunos modelos de teléfono.
El tamaño concreto de la imagen devuelta donde se supone que ha de ser de resolución completa es de un cuarto de la resolución total del sensor. Además, la manera de devolver los datos es distinta según el teléfono, marca, modelo e implementación. Como puede leerse en un comentario de octubre de 2009, Google ha definido cómo debe de ser la petición de captura de imagen, pero no así la implementación de la respuesta en la aplicación de cámara. HTC en su interfaz Sense ha creado su propia manera de hacer fotos, donde los datos devueltos y la manera de tratar la información capturada es distinta a la original.
Si se quiere por tanto tener control sobre la cámara y la foto realizada no hay más remedio que programar un activity propio que haga la vista previa y la captura de la imagen. Este es el único modo de configurar todos los parámetros a medida.
En el siguiente artículo explicaré los problemas que encontré con la creación del activity de foto propio y cómo resolverlos.
Etiquetas: android, cámara, Programación
5 comentarios en “Hacer una foto en el SDK de Android”
marzo 17th, 2010 en 09:48
Pregunta desde la ignorancia: ¿Y no es más fácil actualizar el firmware de tu teléfono a una versión de Android dónde esto se haya solucionado?
marzo 17th, 2010 en 12:56
Oficialmente no hay versión más actual de Android para mi teléfono. Hay algunas por ahí filtradas donde si no falla una cosa falla otra.
Además, si yo actualizase a la 2.1 y usase esa versión del SDK me funcionaría, pero solo a mi, y no funcionaría a la mayoría de los androides del mundo real. Ahora mismo funcionaría en mi teléfono y con suerte en los Nexus One :)
Es más, si actualizo a la versión 2.1 con HTC Sense sigue siendo diferente la aplicación de cámara creada por HTC de la oficial de Android y el problema de la respuesta diferente sigue existiendo.
mayo 8th, 2010 en 02:11
Alucino pepinillos contigo, macho. Te compras un móvil y acabas desarrollándole aplicaciones :-O
mayo 8th, 2010 en 13:34
Hombre, es uno de los motivos por los que cambié a Android desde iPhone ;)
mayo 12th, 2010 en 09:24
Pues yo cambié la radio de mi Magic, y seguía sin detectarme una red. Cambié la rom, ¡y pirulaba! Pero la rom que quité era la más estable y sólo tenía el defecto de que esa red no me funcionaba, así que volví a ella.