Google Cloud Messaging. Parte III: Aplicación cliente

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).


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”.

SDK manager

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"/>

Share Button

17 Comments

  1. Hola Belén, Estoy teniendo tengo problema con el Manifest, me dice que no puede encontrar el símbolo:
    android:name=”com.example.MyGcmListenerService”.

    Tengo instalado el “Google Play Services”, y lo tengo en las dependencias del Gradle, no entiendo por qué me sale ese error, ¿sabes qué podría estar haciendo mal?

    Gracias de antemano.

      1. Si Belén, ya de hecho pude generar un Registration Token. El problema que tengo ahora es que no se cómo hacer llegar notificaciones a mi App.

        Para ello debo crear algún .php en mi servidor?

        Gracias por tu respuesta, en serio.

          1. Ya me funcionó Belén!!! muchísimas gracias por estos manuales, me fueron de mucha ayuda para poder implementar en mi App el GCM.

            Cualquier cosa en que te pueda ayudar cuenta conmigo, ya tienes mi Email.

            Dios te bendiga hoy, mañana y siempre 🙂

  2. hola que tal , muchas gracias por tu tutorial, estoy empezando a basarme en el, solo que me encontre con un pequeño problema con el cual espero me puedas ayudar, al copiar estas lineas
    <receiver android:name="com.google.android.¡¡¡gcm.GCMBroadcastReceiver!!!"

    la parte marcada entre signos de admiración me aparece en color rojo , supongo es un error, pero al compilarlo no me marca que hay error y el color rojo sigue sin quitarse.
    Gracias y éxito.

  3. Hola Belen

    Excelente el tutorial, Gracias!!

    Pero tengo una duda, yo estoy realizando una aplicacion para mi tesis y necesito enviar notificacion desde un servidor a la aplicacion, yo no subire mi aplicacion a play store solo sera una simulacion, pero mi duda es si para hacer uso de GCM tengo que realizar algun pago?

    1. Hola, muchas gracias por tu comentario. Para usar GCM no necesitas tener la aplicación publicada, pero sí necesitarás tener una cuenta de desarrollador, lo que implica un pago. Se necesita un pago para registrarse de $25 (en euros creo que piden 20€). No hay cuota periódica.

  4. Buenas noches te felicito muy buen tutorial, instale el paquete google play services y no me aparece en el sdk /extras/google la carpeta gcm, me podrias guiar, gracias

  5. Hola Bélen,
    Gracias por la ayuda sobre el SDK, tengo algunas dudas, usando el “google play services” dentro de mi proyecto.
    ¿Puedo usar los mismos permisos que tienes en el tutorial o tengo que usar otros?
    ¿Para el registro del servicio GCM, borrado del registro del servicio, y recepción de los mensajes, puedo implementar el mismo código que tienes dentro del tutorial o no?
    ¿Bueno en resumen, puedo seguir este tutorial si uso “google play services” o cambian cosas del PHP, JSON?
    por favor y gracias.

    1. Sí, toda la lógica de GCM no ha cambiado, puedes seguirlo igual. No es que sea un nuevo paquete, sino que ahora, GCM lo han incluido dentro de “google play services” pero sigue siendo el mismo.

  6. Hola Belén,
    Lo primero gracias por el tutorial, muy bien explicado y fácil de entender, lo he intentado hacer, pero me topado con algunos problemas, el primer problema es “Google Cloud Messaging for Android Library” no esta disponible en mi SDK Manager y si busco en “/extras/google/” no puedo encontrar la carpeta gcm, creo que es alguna actualización de google por la imagen de tu SDK no corresponde al SDK que yo tengo, o tengo que importar algo al SDK no lo se si me puedes ayudar por favor y gracias.

    1. Hola, muchas gracias. El tutorial tiene ya un tiempo, por lo que hay algunas cosas que debería actualizar. Efectivamente, en el SDK Manager ya no aparece “Google Cloud Messaging for Android Library” porque está como “deprecated”. Ahora GCM está dentro de “Google Play Services”, por lo que debes instalar este paquete que se encuentra también en la sección de Extras.

Deja un comentario

Tu dirección de correo electrónico no será publicada.

Time limit is exhausted. Please reload the CAPTCHA.