Push notifications en Android a través de Google Cloud Messaging

Buenas noches a todos!, en esta entrada quiero mostrarles de una manera practica la forma de enviar notificaciones remotas a tu dispositivo Android. Me voy a basar en la documentación que ya existe en Android deveolpers, esto para ahorrarme la parte en relación a Google, ya que es un servicio mantenido por el.

Primero que nada necesitamos una cuenta de google, o sea una cuenta de correo gmail para poder acceder a los servicios:

Creando un Proyecto en Google API

  1. Primero tenemos que entrar a la siguiente dirección y abrir la página Google APIs Console page https://code.google.com/apis/console
  2. Si aun no hemos creado un proyecto de google, nos aparecerá la siguiente pantalla:

    Nota: si ya hemos creado un proyecto, la primera página que verás sera tu “dashboard”. Ahí puedes crear un nuevo proyecto abriendo el menú desplegable (en la esquina superior izquierda) escogiendo Other projects > Create.

  3. Clic en Create project. En tu navegador tu URL cambiará en una manera similar a esta:
    https://code.google.com/apis/console/#project:4815162342
  4. Toma nota el valor despues de #project (4815162342 en este ejemplo). Este es tu número de proyecto de google, será utilizado despues como el “GCM Sender ID” en Android.

Habilitando nuestro GCM Service

Para crear notificaciones remotas obviamente se necesita de un third-party server que genere dichas notificaciones. En nuestro caso será la misma maquina de desarrollo, que es Ubuntu en mi caso. Las notificaciones serán generadas por ASP.NET y C#, por lo que usaremos Mono develop en este post.

Antes de comenzar a desarrollar aplicaciones que utilicen el servicio GCM, es necesario tener instalado en nuestro manejador de SDK la API de google.

SDK Manager

Una vez instalado la API de google, necesitamos crear un dispositivo virtual que la utilice.

3

Ademas, debemos de tener una cuenta de google en el dispositivo virtual, es decir, nos vamos a Accounts & Sync y agregamos una cuenta de gmail, en mi caso agregué una dummy.

Para empezar con la programación, crearemos un nuevo proyecto de Android en Eclipse

Creación de proyecto
Creación de proyecto

Seguiremos el asistente de creación de proyecto y las opciones por default es crear un Activity principal, lo dejamos todo por default.

Paso 1: Copiar la libreria gcm.jar en nuestro proyecto

Ahora hay que descargar la siguiente librería http://dl.dropbox.com/u/9043876/Librerias%20Java/android/gcm.jar, esta no recuerdo donde la conseguí, pero según yo viene en el SDK cuando lo descargas, pero en fin.

Este jar lo agregamos en el path de la siguiente maneraCaptura de pantalla de 2013-03-16 23:04:12Esto lo hicimos dando clic derecho en nuestro proyecto y propiedades…

Paso 2: Hacer los siguientes cambios en el Application’s Android manifest

Es necesario agregar permisos y configuración en el archivo XML de configuración, y esta se las muestro a continuación:

Captura de pantalla de 2013-03-16 23:06:21

 

Lo principal que vemos aquí, es que para que google cloud messaging funcione se necesita como minimo la version de Android 2.2, es decir, la API 8, en nuestro caso la aplicación es de la 8 a la 17 (Jelly bean)

Tambien vemos que hemos agregado 6 permisos, los primeros dos son permisos personalizados que indican que solo esta aplicación recibirá estas notificaciones (dado a que cada aplicación recibe sus notificaciones, no queremos interferir). Como ven hemos agregado el nombre de nuestro paquete en los primeros 2 permisos, es por eso que solo recibiremos notificaciones en esta aplicación, así es como se aísla de las demás .

Los demás permisos son para poder recibir notificaciones de GCM, poder user el Internet, acceder a las cuentas registradas en el teléfono y ademas el permiso de WAKE_LOCK es para poder despertar el teléfono en caso de que se encuentre dormido.

Mas abajo, dentro de la etiqueta application, debemos de agregar la declaración de un broadcast receiver, este broadcast receiver será el que reciba las notificaciones como si fuera un “evento”, y así podremos hacer lo que se desee.

Captura de pantalla de 2013-03-16 23:13:32

 

Hemos agregado la declaración de un Broadcast receiver y un Servicio. Esto aún no significa nada, tenemos que crear la clase GCMIntentService, que será nuestro receptor de notificaciones.

Este broadcast es responsable de manejar 2 intents que pueden ser enviados por GCM (RECEIVE y REGISTRATION) es por eso que los definimos en el Android manifest (es mejor aquí que hacerlo programaticamente) en category android:name obligatoriamente debe de ir nuestro paquete principal y es ahí donde debemos de guardar el broadcast receiver, sino no funcionarpa (también estamos obligados a que el broadcast se llame GCMIntentService, sino no funciona).

Paso 3: Crear la clasecom.example.pushnotifications.GCMIntentService

Vamos a crear este broadcast dentro del paquete (en este ejemplo) com.example.pushnotifications:

Primero, crearemos un nuevo paquete (opcional) llamado com.example.pushnotifications.common donde se encontrará una clase llamada Util

Captura de pantalla de 2013-03-16 23:21:04

 

El Sender ID es el código de nuestro proyecto que sacamos de Google API Console

Ahora creamos una nueva clase dentro del paquete principal, y la nombraremos GCMIntentService, y heredará de GCMBaseIntentService

Captura de pantalla de 2013-03-16 23:18:33

La Interfaz GCMBaseIntentService cuenta con cuatro miembros, onError se mandará a llamar en caso de error, onMessage se llamará en caso de que exista una notificación nueva, onRegistered se mandará a llamar cuando el dispositivo se haya registrado a las notificaciones remotas de google, ahí obtendremos un código que debemos guardar y así saber a que dispositivo le enviaremos una notificación.

Paso 4: Iniciar el registro en nusetro Activity principal

Agregaremos lo siguiente a nusetro Activity principal:

Captura de pantalla de 2013-03-16 23:25:06

 

Agregamos la clase GCMRegistrar en el import, y despues en el evento onCreate hemos agregado GCMRegistrar para que verifique si la configuración y el dispositivo se encuentra habilitado y bien configurado para recibir GCM Notifications.

con GCMRegistrar.getRegistrationId(Context) obtenemos el id de registro en caso de que nuestro dispositivo ya se encuentre registrado para notificaciones remotas, es por eso que lo comparamos con una cadena vacía. Si no esta vacía es porque el dispositivo aun no se ha registrado para notificaciones de GCM, por lo tanto mandamos a llamar la función register(Context context,String id). La variable SENDER_ID (lo digo porque en la imaagen no se ven todos los imports) la agregamos como en el broadcast con import static com.example.pushnotifications.common.Util.SENDER_ID (revisen la otra imagen), SENDER_ID como recuerdan guarda el id del proyecto que tiene registrado y habilitado el servicio GCM de google.

Una vez que se manda a llamar la función register, se hará una operación asíncrona, despues de unos segundos, se hará una llamada a nuestro Broadcast Receiver, en este caso será el Receiver REGISTRATION que vimos en ya arriba en la configuración del Android Manifest.

El evento tendrá el código de registro, así que el evento onRegistreded lo modificaremos de la siguiente manera

Captura de pantalla de 2013-03-16 23:31:51 Aquí se supone que debemos de obtener ese ID y subirlo a nuestros servidores y guardarlo en una base de datos, así se podra enviar notificaciones a ese dispositivo en específico.

Si corremos nuestra aplicación en el LogCat tendremos el siguiente resutlado (ojo, el layout no lo modificamos nada, así que no se verá ningún resultado visual, será solo en la consola de debug)

Captura de pantalla de 2013-03-16 23:37:01Como ven, se ejecuta el evento (vean el valor del TAG) en ===GCMIntentService=== son los log que yo he dejado, y yo he imprimido una cadena, que es al que tiene el id de registro de el dispositivo, en teoría en ese evento es donde debemos de dar de alta ese dispositivo y vincularlo con un usuario o no, eso ya depende de nuestra aplicación.

Ese código de registro lo copiamos, porque mas delante haremos la aplicación que irá en nuestro third-party server.

Escribiendo la aplicación del lado del servidor

Como ven estoy en entorno Linux, entonces utilizaré mono develop para crear la aplicación del lado del servidor, pero les voy a explicar como hacerlo sin importar el lenguaje de programación, ya que es un Webservice lo que se consume.

Lo importante que hay que saber aquí, es el Request que vamos a hacer y su contenido. Para hacer un request que envíe una notificación a un dispositivo (o a varios) tenemos que enviar una solicitud POST a https://android.googleapis.com/gcm/send

Una solicitud HTTP esta formada por dos partes, los headers (o encabezados) y su contenido

El header HTTP debe de contener los siguientes encabezados:

  • Authorization:key=YOUR_API_KET
  • Content-Type:application/json para JSON; application/x-www-form-urlencoded;charset=UTF-8 para texto plano

Por ejemplo:

Captura de pantalla de 2013-03-16 23:45:51

 

Para mas información sobre esto, visita http://developer.android.com/google/gcm/gcm.html

En nuestro ejemplo, crearemos un nuevo proyecto en Mono develop utilizando un sitio web vacío en ASP.NET y C#. Como está vacío, agregaremos una nueva página con su code behind.

Captura de pantalla de 2013-03-16 23:47:08

 

Es un simple formulario ASP con un solo campo y un botón.

Captura de pantalla de 2013-03-16 23:48:54

 

Ahora nos vamos al code-behind donde escribiremos el evento btnSend_Onclick (nota, si a este momento quisiste correr el proyecto tal vez te surgirá un error porque no has definido el método btnSend…)

Captura de pantalla de 2013-03-16 23:50:50

 

Primero que nada, creamos el método SendGuidToGoogle con un parámetro string, la definición del método es la siguiente:

Captura de pantalla de 2013-03-16 23:54:48  Captura de pantalla de 2013-03-16 23:53:45

 

Aqui lo que estamos haciendo es enviar una notificación con la información mostrada en el comentario Formato JSON preview:

estamos diciendo que delay_while_idle es falso, lo que significa que si el dispositivo no esta conectado a internet o esta apagado, esta notificación no le llegará. collapese_key:newNotification es nuestra lista de notificaciones, es decir, si llegan 5 notificaciones con collapse_key: newNotificacion esperando a ser entregadas, solamente se entregará la última y se descartarán las demás, si no quieren esto, simplemente eliminen esa propiedad, registration_ids:[…,…,…] es un arreglo donde irán todos los ids a los que queremos que esta notificación llegue, manejalo en singular si solo quieres enviar una notificación a un solo dispositivo. Dentro de data vienen los datos que queremos enviar, todo esto en formato json, quiere decir que {message: myMessage} es un objeto JSOn donde podemos enviar lo que sea (con un limite de kilobytes)

Corriendo la aplicación corriendo, abrimos nuestra página y ahora ya podremos enviar un mensaje, recuerden que se ejecutará el onMessage de nuestro broadcast receiver, allí yo he puesto un Log.d para ver el mensaje

Captura de pantalla de 2013-03-17 00:00:15 Captura de pantalla de 2013-03-17 00:00:28

 

Dentro del método onMessage podremos hacer lo que se desee, si la app esta presente o minimizada, este evento se ejecutará y se podra mostrar algún mensaje ( lo mas común una notificación Android o un toast message)

Por ahora, esto es todo. Mañana subiré el código a dropbox para que lo puedan descargar

Saludos! y espero que les sirva

Anuncios

8 comentarios sobre “Push notifications en Android a través de Google Cloud Messaging

  1. Attractive section of content. I just stumbled upon
    your site and in accession capital to assert that I get in fact enjoyed account your blog posts.
    Anyway I will be subscribing to your feeds and even I achievement you
    access consistently quickly.

  2. Hola Isaac. Gracias por tu Post. Estoy probando lo que nos cuentas y me quedo estancado en la llamada desde la web. Veo que el mensaje lo generas desde un pequeño formulario y la verdad es que me ayudaria mucho un ejemplo. Podrias ayudarme?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s