{"id":3129,"date":"2022-10-16T20:57:09","date_gmt":"2022-10-16T20:57:09","guid":{"rendered":"https:\/\/blog.rastersoft.com\/?p=3129"},"modified":"2022-10-16T20:57:11","modified_gmt":"2022-10-16T20:57:11","slug":"documentando-con-los-pies-2","status":"publish","type":"post","link":"https:\/\/blog.rastersoft.com\/?p=3129","title":{"rendered":"Documentando con los pies (2)"},"content":{"rendered":"\n<p>En la entrada anterior expliqu\u00e9 c\u00f3mo constru\u00ed un pedal para tomar fotograf\u00edas desde el m\u00f3vil y as\u00ed simplificar el documentar proyectos hardware. Por desgracia, cuando lleg\u00f3 el momento de usarlo por primera vez me encontr\u00e9 con un problema: resulta que la aplicaci\u00f3n de c\u00e1mara de Android se cierra autom\u00e1ticamente al cabo de dos minutos de no hacer nada con ella. Esto es un problema porque entre foto y foto bien puede pasar mucho m\u00e1s tiempo, lo que me obligar\u00eda a acercarme al m\u00f3vil y lanzar la aplicaci\u00f3n de nuevo. Esto no tiene nada que ver con el apagado autom\u00e1tico de la pantalla: aunque le ponga media hora para que apague la pantalla, la aplicaci\u00f3n de la c\u00e1mara vuelve a la pantalla principal a los dos minutos de estar \u00absin hacer nada\u00bb.<\/p>\n\n\n\n<p>Obviamente esto es completamente inaceptable, as\u00ed que decid\u00ed agarrar el toro por los cuernos y escribir una peque\u00f1a aplicaci\u00f3n de c\u00e1mara para Android que no tuviese este problema. Para ello part\u00ed de un <a rel=\"noreferrer noopener\" href=\"https:\/\/developer.android.com\/codelabs\/camerax-getting-started#0\" target=\"_blank\">ejemplo de c\u00f3mo utilizar la c\u00e1mara en Android<\/a>, escrito en <a rel=\"noreferrer noopener\" href=\"https:\/\/en.wikipedia.org\/wiki\/Kotlin_(programming_language)\" target=\"_blank\">Kotlin<\/a>. Reconozco que no es un mal lenguaje, pero no le acabo de pillar el punto (todo lo contrario que <a href=\"https:\/\/en.wikipedia.org\/wiki\/Go_(programming_language)\" target=\"_blank\" rel=\"noreferrer noopener\">Go<\/a>&#8230; pero esa es otra historia).<\/p>\n\n\n\n<p>Tras una primera prueba, consegu\u00ed que funcionase de manera constante. Sin embargo, me encontr\u00e9 con la desagradable sorpresa de que el tener la c\u00e1mara funcionando constantemente hace que el m\u00f3vil se caliente un mont\u00f3n, cosa que no me hac\u00eda nada de gracia (de hecho, al buscar por qu\u00e9 la aplicaci\u00f3n oficial de c\u00e1mara se cerraba a los dos minutos, uno de los motivos que dec\u00eda era ese; me parec\u00eda muy extra\u00f1o, teniendo en cuenta que s\u00ed puedes grabar v\u00eddeo durante m\u00e1s tiempo, pero visto lo visto, podr\u00eda ser una de las razones).<\/p>\n\n\n\n<p>Ante esto, tuve que complicar un poco la aplicaci\u00f3n, haciendo que la c\u00e1mara se desactive al cabo de un tiempo sin hacer nada, pero dejando la aplicaci\u00f3n en primer plano y activando de nuevo la c\u00e1mara tan pronto se pulsa uno de los botones de volumen para tomar una foto. De esta manera el m\u00f3vil no se recalienta.<\/p>\n\n\n\n<p>Como comienzo no estuvo mal, pero claramente ten\u00eda un problema: \u00bfc\u00f3mo puedo saber si una foto es buena, o tengo que repetirla? La soluci\u00f3n fue relativamente sencilla: a\u00f1adir la posibilidad de enviar cada foto tomada a mi port\u00e1til, que estar\u00eda en un sitio donde podr\u00eda ver f\u00e1cilmente el resultado. As\u00ed, a\u00f1ad\u00ed dos campos de texto en la app en los que teclear la direcci\u00f3n IP del port\u00e1til y un puerto (por defecto usa el 9000), y en \u00e9ste correr una peque\u00f1a aplicaci\u00f3n en python que se limite a escuchar por dicho puerto, y cuando se abra, recibir los datos de la imagen en formato JPEG, descomprimirlos, y mostrarlos en la pantalla.<\/p>\n\n\n\n<p>El resultado era bastante bueno, pero ten\u00eda un problema a\u00fan: la c\u00e1mara de mi m\u00f3vil es de 4160&#215;3120 pixels, un tama\u00f1o exageradamente grande que resulta en ficheros muy grandes. El resultado es que entre que pulso el pedal y aparece la foto en el port\u00e1til pasan unos nueve segundos (tres de los cuales son debidos a tener que encender la c\u00e1mara). Para resolverlo a\u00f1ad\u00ed un campo de \u00abresoluci\u00f3n\u00bb, que permite poner un tama\u00f1o deseado (yo le pongo 2048), de manera que el m\u00f3vil escoger\u00e1 la resoluci\u00f3n m\u00e1s cercana a ese valor entre los que permita la c\u00e1mara. Con esto, el tiempo baja a cuatro segundos si la c\u00e1mara estaba apagada, y un segundo si la c\u00e1mara estaba encendida (por ejemplo si no nos gusta la foto y decidimos sacar otra, la c\u00e1mara estar\u00e1 ya encendida y ser\u00e1 much\u00edsimo m\u00e1s r\u00e1pido).<\/p>\n\n\n\n<p>El c\u00f3digo fuente (compilable con Android Studio) est\u00e1 disponible en mi repositorio GIT: <a rel=\"noreferrer noopener\" href=\"https:\/\/gitlab.com\/rastersoft\/footcam\" target=\"_blank\">https:\/\/gitlab.com\/rastersoft\/footcam<\/a>. Hay un paquete APK para Android ya compilado que se puede descargar desde la secci\u00f3n <a rel=\"noreferrer noopener\" href=\"https:\/\/gitlab.com\/rastersoft\/footcam\/-\/tags\" target=\"_blank\">Tags<\/a>, simplemente pinchando en el n\u00famero de versi\u00f3n. En el repositorio principal se puede descargar el programa de visualizaci\u00f3n remota, llamado \u00ab<a rel=\"noreferrer noopener\" href=\"https:\/\/gitlab.com\/rastersoft\/footcam\/-\/raw\/master\/receiver.py?inline=false\" target=\"_blank\">receiver.py<\/a>\u00ab. Para utilizarlo, adem\u00e1s de <a rel=\"noreferrer noopener\" href=\"https:\/\/www.python.org\/downloads\/\" target=\"_blank\">Python3<\/a> es necesario <a href=\"https:\/\/www.wxpython.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">WxPython<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En la entrada anterior expliqu\u00e9 c\u00f3mo constru\u00ed un pedal para tomar fotograf\u00edas desde el m\u00f3vil y as\u00ed simplificar el documentar proyectos hardware. Por desgracia, cuando lleg\u00f3 el momento de usarlo por primera vez me encontr\u00e9 con un problema: resulta que la aplicaci\u00f3n de c\u00e1mara de Android se cierra autom\u00e1ticamente al cabo de dos minutos de &hellip; <a href=\"https:\/\/blog.rastersoft.com\/?p=3129\" class=\"more-link\">Seguir leyendo <span class=\"screen-reader-text\">Documentando con los pies (2)<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,1,6],"tags":[],"class_list":["post-3129","post","type-post","status-publish","format-standard","hentry","category-cacharreo","category-sin-categoria","category-trucos"],"_links":{"self":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3129"}],"version-history":[{"count":2,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3129\/revisions"}],"predecessor-version":[{"id":3131,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=\/wp\/v2\/posts\/3129\/revisions\/3131"}],"wp:attachment":[{"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.rastersoft.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}