Buenas!
En esta entrada nos alejamos un poco de la línea general de este blog, para aprender un poco de programación de Android con objeto de disponer de una aplicación autónoma para tomar fotos de forma desatendida y enviarlas por email mediante nuestra conexión de Datos en un móvil con este sistema operativo. Ya conocemos cómo funciona un lenguaje de programación como el que usamos en el IDE de Arduino, se compone de unas reglas, una sintaxis y unas palabras reservadas para declarar variables, funciones, etc. Android se basa en otro lenguaje de programación, Java cuyo concepto, estructura, particularidades y sintaxis se pueden aprender buscando por internet
Aunque tampoco debemos entrar en profundidad, más bien "ir al grano". La idea es tener un pequeño sistema de vigilancia desatendido, en un entorno sin ningún tipo de energía. El móvil opcionalmente solo contará con un cargador solar de apoyo para su alimentación. Esta entrada en realidad podría ser el complemento a la del cargador solar para móvil, como proyecto real práctico, convirtiendo nuestro obsoleto y abandonado móvil en un sistema de vigilancia.
Antes de crear la aplicación he buscado alguna utilidad que pudiera hacer lo mismo, pero no he podido encontrar nada, así que la cocinamos.
SDK Android
Descargamos el SDK de Android, https://developer.android.com/studio
Seguimos las recomendaciones básicas del siguiente artículo.
En mi caso aprovecharé un móvil con Android 6, por lo que descargaré la API (interfaz de programación de aplicaciones, o conjunto de bibliotecas y funciones) apropiadas para el desarrollo en dicha versión de Android.
La descarga del instalador es rápida, la instalación de la paquetería se demora algo más debido a que se descarga desde el repositorio de google.
![]() |
Detalle del IDE de Android, teléfono emulado con la aplicación cargada |
Podemos aprender más del lenguaje de programación android (que puede ser java o kotlin) en este enlace.
Enviar email desde la aplicación android de manera desatendida
Al seguir los "consejos" para enviar un email de forma desatendida y dejar todo el código me encuentro con el siguiente error:
NetworkOnMainThreadException: The exception that is thrown when an application attempts to perform a networking operation on its main thread.
Esto se debe a que debe realizarse el envío de manera asíncrona, no se permite el envío desde el thread (hilo) principal de mainactivity, por lo que es preciso hacer uso de alguna utilidad para realizar el envío de mensaje de manera asíncrona, en el ejemplo se ha optado por hacer uso de la clase AsyncTask
Una vez tengamos todo preparado y configurado debemos tener en cuenta que es preciso configurar la cuenta de correo de envío de gmail, en nuestro ejemplo, de la manera apropiada.
En el android-manifest.xml debemos incluir el permiso android INTERNET
<uses-permission android:name="android.permission.INTERNET" />
Con el ejemplo descrito en el código de referencia se ha podido enviar un email desde Android Studio a una cuenta de correo. Es obligatorio descargar las librerías .jar que se dejan en el enlace y ubicarlas en el directorio donde se encuentra el fichero mainActivity.java y botón derecho en el explorador de android studio sobre cada una de las mismas pulsando la opción "Add as library".
Lanzar la aplicación (cámara) al iniciar el móvil, obtener la foto y utilizar el servicio de envío de email
Utilizaremos el objeto Camera, para referenciar la camara y realizar las operaciones que necesitamos. Podemos encontrar literatura para hacer uso de los objetos Intent, pero en la práctica requieren la intervención del usuario, por lo que es mejor hacer uso del objeto Camera. Cosas a destacar: no eliminar la sesión de la cámara antes de tiempo, "dormir" el procesamiento del hilo para que dé tiempo a la cámara a iniciarse, dar de alta los permisos necesarios en el manifiesto de Android, android_manifest.xml (importante para que la app se arranque al iniciar el móvil), cuyo código funcional se muestra a continuación, probado en un Redmi NOte 7A,
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TomaFotoEnviaFoto">
<receiver
android:enabled="true"
android:exported="true"
android:name=".CamaraRunOnStartup"
android:label="CamaraRunOnStartup"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
<category android:name="android.intent.category.DEFAULT" />
<action android:name="android.intent.action.REBOOT"/>
</intent-filter>
</receiver>
Importante añadir todos los permisos en el administrador de aplicaciones del móvil, una vez instalada. Y ejecutar una primera vez (no funcionará) para aceptar los permisos, eliminar la instancia de memoria reciente y volverla a ejecutar.
Todo esto se compondría de varias acciones y subacciones:
- 1.Tomar y guardar fotos sin intervención del usuario, que a su vez implica
- 1.1. Hacer uso del objeto Camera para inicializar la cámara y gestionar la captura y guardado de las imágenes
- 1.2. Crear un servicio en una clase pública con el nombre del servicio que lance la clase principal al inicio de la pantalla del escritorio del móvil creando un bloque receiver en el androidmanifest.xml con el permiso RECEIVE_BOOT_COMPLETED. Fichero CamaraRunOnStartup.java
- 1.3. Quitar el bloqueo de la SIM, depende del modelo de móvil android.
- 1.4. Quitar el bloqueo de pantalla (deslizar con el dedo) y eliminar la suspensión de la pantalla de bloqueo, también depende del modelo y sistema operativo android (En miui 10, por ejemplo, quitar el bloqueo de deslizar con el dedo se consigue con Ajustes/ Sobre el teléfono/ en Versión MIUI, pulsa cinco veces seguidas hasta que se active Opciones desarrollador. Vuelve a Ajustes/ Ajustes adicionales/ Opciones desarrollador/ pulsa sobre: Omitir bloqueo de pantalla)
- 2. Enviar la foto tomada por email en segundo plano y de manera asíncrona , para lo que haremos uso de unas librerías jar "tuneadas" que habrá que incorporar a nuestro proyecto en la clase class class Mail extends javax.mail.Authenticator {
...
Añadimos el código dentro de la Asyntask de email
m.addAttachment(MainActivity.getCurrentPathFile());//hemos creado previamente una función publica que nos
Aclarar que la función principal que controla la acción con la cámara y el envío por email es
//devuelve la ruta en una variable estática
public void takePictureNoPreview(Context context)
por lo que una vez que hemos salvado todos los condicionantes es preciso lanzar la instancia de envío de email con la captura con la siguiente sentenciaIncluimos dentro de takePictureNoPreview
new emailSendBackground().execute();
Últimos pasos en la configuración
Añadimos los últimos pasos
- 3. Instalar la aplicación (ver punto 1.3 y 1.4), aceptar los permisos, configurarla en el móvil para que se ejecute sin restricciones, con inicio automático (para los Redmi con Android 7) y ejecutarla un par de veces para que se activen los permisos que permitan acceder a los ficheros, compartir y obtener el intent android.intent.action.BOOT_COMPLETED, probar a reiniciar para verificar que se ejecuta nada más iniciar el móvil.
- 4. Crear una programación que apague el móvil y lo encienda una vez cada dos días, por ejemplo, para ahorrar batería
- 5. Opcional: añadir un circuito de carga solar de tal manera que cuando haya suficiente luz, se cargue la batería (referenciado en otras entradas de este blog)
- 6. Opcional: incluir en el código una medición del estado actual de la batería lo que nos permitirá extraer datos del funcionamiento del móvil en ausencia de carga o con carga solar (punto 4).
Código de referencia
Y eso es todo,
Muchas gracias por vuestro tiempo y atención, espero que os resulte útil!
Saludos!
Referencias
- https://developer.android.com/training/camera/photobasics?hl=es-419#java
- https://stackoverflow.com/questions/27792615/boot-complete-is-not-working-in-android-redmi?noredirect=1&lq=1
- https://www.vogella.com/tutorials/AndroidCamera/article.html
- https://stuff.mit.edu/afs/sipb/project/android/docs/training/camera/photobasics.html
- https://www.tutorialspoint.com/how-to-start-an-android-application-at-boot-time
- https://soloelectronicos.com/2017/01/05/envio-de-e-mail-sin-intervencion-del-usuario-en-android-studio/
- https://support.google.com/a/answer/176600?hl=es
- https://es.stackoverflow.com/questions/21574/error-al-intentar-env%C3%ADar-un-email-android-os-networkonmainthreadexception
- https://www.hostinger.es/tutoriales/como-usar-el-servidor-smtp-gmail-gratuito
- https://stackoverflow.com/questions/21103314/sending-email-on-android-using-smtp-and-gmail-how-to-make-it-work
- https://www.stacktips.com/tutorials/android/how-to-send-email-in-android
- https://jarroba.com/asynctask-en-android/
- https://developer.android.com/training/monitoring-device-state/battery-monitoring#java
- https://suragch.medium.com/android-asynctasks-99e501e637e5