martes, 4 de octubre de 2011

Prácticas Android: ejecutando aplicaciones apk desde otras aplicaciones Android


En un post anterior vimos un ejemplo de cómo comunicar dos aplicaciones Android independientes pero, claro está, eso suponía que la aplicación invocada debía estar instalada antes de la llamada, de lo contrario, lo único que podíamos hacer era mostrar un mensaje avisando de la ausencia de la misma. En este ejemplo damos un paso más allá: ejecutar automáticamente el archivo de instalación de la aplicación externa requerida si ésta no está presente en el sistema. La actividad principal consiste en un cuadro de texto donde se escribirá la ruta de un archivo y un botón para activar el explorador de archivos OI File Manager que permita seleccionarlo de forma visual sin necesidad de escribir la ruta a mano. Si el explorador está instalado se despliega normalmente; si no, se ejecuta el archivo de instalación.

Para que esto sea posible se copia el archivo de instalación del OI File Manager en la subcarpeta /res/raw del árbol del proyecto. Esto supone la integración total de dicho archivo con el resto del proyecto. Cuando se envía un intent al explorador y éste no responde, se hace una copia temporal del archivo apk de /res/raw a la tarjeta SD (véase el método boolean guardarRawComo(String nombreFichero)). Una vez desplegado el apk en la SD ya podemos proceder a su ejecución con el envío de un nuevo intent con una acción de tipo ACTION_VIEW que activará la actividad de instalación. Al terminar y devolver el control a la actividad principal, se elimina el archivo temporal de la SD. Es importante contar el permiso de instalación de paquetes "android.permission.INSTALL_PACKAGES" declarado en el descriptor AndroidManifest.xml.

Puedes descargar el proyecto NetBeans aquí.



domingo, 2 de octubre de 2011

Practicas Android: capturando información de las llamadas entrantes


Para capturar información de las llamadas telefónicas necesitamos una clase especial de tipo BroadcastReceiver. Dentro de esta clase creamos un objeto de la clase TelephonyManager y lo registramos como servicio del sistema. Por otro lado, tenemos otra clase que deriva de PhoneStateListener que implementa el método onCallStateChanged() para detectar las llamadas entrantes. El método onReceive() de la clase BroadcastReceiver recoge el número del llamante del objeto Intent usando las siguientes líneas de código para consultar el valor de la clave incoming_number:

Bundle bundle = intent.getExtras();
String phone_number = bundle.getString("incoming_number");

Puedes descargar el proyecto Netbeans de ejemplo aquí. Ten en cuenta que esta aplicación no dispone de interfaz gráfica. Tendrás que abrir el log del terminal donde ejecutes la aplicación y a continuación abrir un segundo terminal desde el que realizar la llamada. La salida del programa se producirá en el log, tal y como indica la figura. Detectará el teléfono del llamante y cuando descuelgues registrará esta situación.