The Google Cloud Messaging (GCM) guide can be found here and is available in English, therefore I am writing these related posts in Spanish.
Esta es la parte III de un conjunto de entradas sobre Google Cloud Messaging (GCM).
- Parte I: Introducción.
- Parte II: Activación del servicio.
- Parte III: Aplicación cliente.
- Parte IV: Aplicación cliente.
- Parte V: Envío de mensajes.
- Parte VI: Respuesta al envío de mensajes.
Los pasos que vamos a seguir en nuestra aplicación Android para que juegue el rol de cliente y reciba los mensajes de nuestro servidor son los siguientes:
- Instalar la librería de GCM.
- Añadir los permisos al archivo “AndroidManifest.xml”.
- Implementar el código para registrarse al servicio (y darse de baja).
- Implementar el código del servicio que va a recibir los intents.
En esta parte sobre GCM, vamos a entrar en detalle sobre los dos primeros puntos. Los dos últimos se expondrán en la siguiente parte.
Librería GCM
En este tutorial vamos a instalar una librería adicional en nuestro SDK de Android que nos va facilitar la implementación del cliente de GCM. Puede realizarse igualmente sin el uso de esta librería, pero el código es mucho más sencillo e intuitivo haciendo uso de ella.
Abrimos el SDK Manager y en la sección de “Extras” seleccionamos “Google Cloud Messaging for Android Library”.
La instalamos y tras finalizar, en el directorio donde tenemos la instalación del SDK, dentro de la ruta “/extras/google/” se ha creado la carpeta llamada “gcm” que a su vez contiene las carpetas “gcm-client”, “gcm-server” y “samples”. Dentro del directorio “gcm-client/dist” encontramos el archivo “gcm.jar”, el cual debemos importar en nuestra aplicación.
Actualización!!
El paquete de GCM ya no se encuentra como “Google Cloud Messaging for Android Library”, ahora forma parte de “Google Play services” que se encuentra también en la sección de “Extras”.
Para saber cómo añadir Google Play Services a vuestro proyecto podéis seguir la guía oficial aquí.
Android Manifest
El siguiente paso que podemos seguir, es modificar el archivo “AndroidManifest.xml” para configurarlo correctamente.
- Si el uso de GCM es imprescindible para nuestra aplicación, debemos establecer la mínima versión del SDK, a la 8, es decir, Android 2.2.
<uses-sdk android:minSdkVersion="8" ... />
- Añadimos permisos para evitar que otras aplicaciones se registren y reciban los mensajes de nuestra aplicación. Debemos especificar el mismo nombre que el del paquete de nuestra aplicación (que se encuentra también indicado en el propio manifest).
<permission android:name="my_pack.permission.C2D_MESSAGE" android:protectionLevel="signature"/> <uses-permission android:name="my_pack.permission.C2D_MESSAGE"/>
- Añadimos el resto de permisos.
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
“GET_ACCOUNTS” nos permite acceder a la cuenta de Google del dispositivo, la cual es necesaria si la versión instalada es inferior a Android 4.0.4.
- Dentro de la etiqueta “application” añadimos el receptor o cliente de los mensajes. Son 2 intents los que pueden recibirse del GCM: “REGISTRATION” y “RECEIVE”.
Gracias a que estamos usando la librería de GCM para Android, no tenemos que implementar nuestra propia clase cliente, sino que usamos la que la librería nos proporciona com.google.android.gcm.GCMBroadcastReceiver.<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="my_pack" /> </intent-filter> </receiver>
Se debe declarar de esta forma, y no mediante programación, para que los mensajes sean recibidos incluso si la aplicación no se está ejecutando.
El permiso “SEND” se incluye para que tan sólo se reciban intents provenientes de los servidores GCM. - Añadimos un servicio cuyo nombre debe ser “GCMIntentService”. Este nombre es al que se llama desde el receptor anterior. Este servicio sí tenemos que implementarlo con nuestras propias acciones.
<service android:name=".GCMIntentService"/>