Comunicación con otras apps – Capítulo 7 – Curso Android

0

En el capítulo anterior de nuestro curso Android vimos cómo hacer que nuestra aplicación interactúe con los eventos del sistema para, por ejemplo, ejecutar una acción cuando la pantalla se apaga, o se enciende.

En esta ocasión, usaremos el mismo principio para conseguir que dos aplicaciones diferentes se envíen mensajes a través del sistema.

En Android, y en la mayoría de los sistemas operativos modernos, las aplicaciones se ejecutan en espacios de memoria separados, lo que aumenta la seguridad de éste al impedir que una aplicación malintencionada, o no, afecte al funcionamiento de otra.

Para las contadas ocasiones en las que necesitemos enviar mensajes entre aplicaciones, el sistema provee de una interfaz que permite tanto la transmisión como la recepción automática de los mismos, siempre y cuando la aplicación que recibe el mensaje esté preparada para ello.

Enviar un mensaje

Para la transmisión del mensaje utilizaremos un objeto que los seguidores de este curso ya conocen, el intent, que permite el paso de información a través de la cola de eventos de Android.

Al inicializar el objeto simplemente deberemos tener en cuenta que deberemos indicar el nombre del paquete y la clase que debe recibir el mensaje, así como la acción concreta que implementa el mensaje, que permitirá al receptor obtener correctamente los parámetros que incluyamos.

Intent intent = new Intent();

intent.setClassName(“NOMBRE_DEL_PAQUETE”, “NOMBRE_DE_LA_CLASE”);

intent.setAction(“NOMBRE_DE_LA_ACCIÓN”);

intent.putExtra(“NOMBRE_DEL_PARÁMETRO_1”, “VALOR_DEL_PARÁMETRO_1”);
…
intent.putExtra(“NOMBRE_DEL_PARÁMETRO_N”, “VALOR_DEL_PARÁMETRO_N”);

Finalmente, enviaremos el mensaje usando el procedimiento asíncrono sendBroadcast, que incorpora la superclase Context, y por ende también las clases Activity y Service, que son las que habitualmente tratan estos temas

context.sendBroadcast(intent);

Recibir un mensaje

Para la recepción del mensaje deberemos usar el mecanismo indicado en la sesión anterior para la recepción de eventos del sistema, es decir, definir la acción en el manifiesto de nuestra aplicación, asociándolo a la misma clase que se usa al enviarlo, tal como se indica a continuación.

<receiver android:name=”NOMBRE_DE_LA_CLASE” android:exported=”true”>
  <action android:name=”NOMBRE_DE_LA_ACCIÓN” />
</receiver>

Tal como se indica en el ejemplo anterior, no deberemos olvidar añadir el atributo exported que indica que la clase puede ser activada desde otras aplicaciones, tal como es el caso.

Comunicación entre apps

Devolución de resultados

En caso que la aplicación que recibe el mensaje deba devolver algún tipo de resultado, deberemos utilizar el mismo mecanismo descrito anteriormente (creación de un nuevo intent y envío a la primera aplicación, en la cual habremos definido un BroadcastReceiver que se encargará de procesar el resultado, de forma asíncrona).

Activar otras aplicaciones

En ocasiones puede resultar útil que vuestra aplicación active otras aplicaciones, bien se trate de aplicaciones de sistema o de aplicaciones que hayáis descargado de la Play Store, o de alguna otra tienda oficial.

En general Android no ofrece una interfaz de activación para las aplicaciones de sistema, por lo que un método que funciona correctamente en una versión puede no funcionar en la siguiente actualización del sistema, no obstante, los ejemplos que os proporcionamos a continuación se han mostrado funcionales.

Activar la bandeja de entrada de mensajes de texto

Intent intent = new Intent();
intent.setClassName("com.android.mms", "com.android.mms.ui.ConversationList");
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK  | Intent.FLAG_ACTIVITY_SINGLE_TOP |
                Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY |
                Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

Activar el registro de llamadas

Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setType(CallLog.Calls.CONTENT_TYPE);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK  | Intent.FLAG_ACTIVITY_SINGLE_TOP |
                Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY |
                Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);

Podéis encontrar información sobre la activación de otras aplicaciones de sistema en Google, para lo que os recomendamos la siguiente búsqueda: “open NOMBRE_APLICACIÓN +intent” o en el foro de desarrolladores stackoverflow.com

En cuanto a las aplicaciones de usuario, y pese a que las interfases de acceso también pueden variar, el mecanismo es el siguiente:

    1. Decompilar la aplicación para acceder al manifiesto de la misma.
    2. Abrir el manifiesto con un editor de texto.
    3. Los posibles puntos de entrada a la misma son aquellos que tengan asignado el atributo exported, tal como hemos indicado anteriormente.

Lógicamente, habrá que perder algún tiempo en comprobar los efectos que tiene la activación de cada uno de ellos, hasta encontrar el que hace lo que queremos que haga, si es que lo hay.

Algunas aplicaciones, como por ejemplo el calendario, generan mensajes que pueden ser capturados por otras aplicaciones,
lo que permite no sólo su monitorización, sino también su sustitución, según el caso.

Dado que estos mensajes no son parte del núcleo de Android, no es posible obtener documentación de Google sobre este tema, por lo
que su detección no es fácil y se realiza mediante la monitorización de los logs de sistema y el seguimiento del código fuente de las propias aplicaciones, que es posible obtener en diversos repositorios, como el de CyanogenMOD.

La próxima semana os enseñaremos cómo crear un widget en vuestra aplicación Android.

Como siempre, os invitamos a visitar el Hilo oficial del Curso de Android de Foromóviles, donde podéis hacernos llegar vuestras dudas y comentarios.

Sin comentarios

Dejar respuesta