Lo que vamos a ver en este post es como hacer andar los ejemplos que nos facilita google de GCM para appengine (java) y android.
Empezamos:
Arquitectura de los ejemplos:
El servicio.
Paso 1:
Este nuevo servicio se encuentra disponible en la consola de servicios de google, lo primero que tenemos que hacer es activar dicho servicio en:
Google APIs Console page.
Paso 2:
Si no tienen un proyecto activo, debes crear uno:
Si ya tienes un proyecto, puedes agregar (en: Dashboard Api Project ->Other projects -> Create) o usar uno existente, cuando estamos en el proyecto, vemos uno dirección como esta:
https://code.google.com/apis/console/#project:4815162342
El dato que nos interesa es el project Id: 4815162342
Paso 3:
Activamos el servicio:
- In the main Google APIs Console page, select Services.
- Turn the Google Cloud Messaging toggle to ON.
- In the Terms of Service page, accept the terms.
Paso 4:
Obtenemos el Api key :
1. Vamos a API Access
2. Create new Server key
3. Click Create
Estas key se pueden cambiar en cualquier momento (tener en cuenta que la vieja key seguirá activa por 24hs), además luego podemos restringir los ip que pueden acceder al servicio! (IPs)
Bueno en este punto ya tenemos el servicio activo y listo para usar!
Vamos con los ejemplos
Servidor
1 – Instalamos los ejemplo y librerías de ayuda
En el SDK manager de android, instalamos: Extras > Google Cloud Messaging for Android Library, esto nos creará unas carpetas en: YOUR_SDK_ROOT/extras/google/
Tener en cuenta que tenemos que tener el último sdk de android (_r20 al día de la fecha) porque sino nos nos va a aparecer el extra GCM
gcm-client, gcm-server, samples.
Lo que nos bajó aquí es: los helper necesarios para android (client) y java (servlets), ademas de unos ejemplos que utilizan estos helper en: android, appWeb Java y para una appWeb en appengine (java), lastima que nada para appEngine python…
ese es mi próximo post!
2 – Descargamos google appEngine (java) y lo instalamos ver aqui
3 – Editamos la varible ATTRIBUTE_ACCESS_KEY del archivo: /extras/google/gcm/samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java
2 | * Context initializer that loads the API key from the App Engine datastore. |
4 | public class ApiKeyInitializer implements ServletContextListener { |
6 | static final String ATTRIBUTE_ACCESS_KEY = "API key" ; |
En este punto y aunque no este en la doc oficial, yo agregué el API Key en:
entity.setProperty(ACCESS_KEY_FIELD, ATTRIBUTE_ACCESS_KEY);
del mismo archivo: /extras/google/gcm/samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java
4 – nos vamos al directorio: cd /extras/google/gcm/samples/gcm-demo-appengine
Tenemos que armar el paquete de nuevo con el cambio:
06 | [mkdir] Created dir: build/classes |
07 | [mkdir] Created dir: dist |
10 | [javac] Compiling 6 source files to build/classes |
13 | [war] Building war: <strong>dist/gcm-demo.war</strong> |
5 – Ejecutamos el servidor de desarrollo de appengine con el comando ant y le indicamos donde esta el sdk appengine y cual es el ip host
si no tenemos ant, tienen que instalarlo, en linux el comando es:
$ sudo apt-get install ant
01 | $ ant -Dsdk.dir=/opt/google/appengine-java-sdk runserver -Dserver.host=192.168.1.10 Buildfile: gcm-demo-appengine/build.xml |
03 | [mkdir] Created dir: gcm-demo-appengine/dist |
10 | [enhance] DataNucleus Enhancer (version 1.1.4) : Enhancement of classes |
11 | [enhance] DataNucleus Enhancer completed with success for 0 classes. Timings : input=28 ms, enhance=0 ms, total=28 ms. Consult the log for full details |
12 | [enhance] DataNucleus Enhancer completed and no classes were enhanced. Consult the log for full details |
15 | [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.jetty.JettyLogger info |
16 | [java] INFO: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger |
17 | [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml |
18 | [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/appengine-web.xml |
19 | [java] Jun 15, 2012 8:46:06 PM com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml |
20 | [java] INFO: Successfully processed gcm-demo-appengine/WebContent/WEB-INF/web.xml |
21 | [java] Jun 15, 2012 8:46:09 PM com.google.android.gcm.demo.server.ApiKeyInitializer contextInitialized |
22 | [java] SEVERE: Created fake key. Please go to App Engine admin console, change its value to your API Key (the entity type is 'Settings' and its field to be changed is 'ApiKey'), then restart the server! |
23 | [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start |
25 | [java] Jun 15, 2012 8:46:09 PM com.google.appengine.tools.development.DevAppServerImpl start |
6 – ver en un browser: http://192.168.1.10:8080/
Perfecto! ahora vamos con android…
En la documentación original, compila, instala y prueba desde la consola, nosotros lo vamos a hacer en eclipse para poder hacer debug, ver variables etc..
1 – Abrimos eclipse (supongamos que ya lo tienen configurado con el sdk y emulador), sino lo pueden hacer por consola como en la
doc original, y ponemos:
file > new > project… > android > Android Project from existing code
Root Directory: AndroidSdk/extras/google/gcm/samples/gcm-demo-client
Seleccionamos el proyecto y finish
Ya tenemos el proyecto en eclipse, al cual podemos hacer click derecho > properties > android y le ponemos el target que necesitemos
recordar que esto funciona a partir de android 2.2 api 8 en adelante, y que si utilizamos una versión de android inferior a Android 4.04, tiene que tener si o si al menos una cuenta google asociada!
2 – Editamos el archivo: CommonUtilities.java
01 | public final class CommonUtilities { |
06 | static final String SERVER_URL = "http://192.168.1.10:8080" ; //local IP donde esta corriendo el servidor de desarrollo del appengine |
09 | * Google API project id registered to use GCM. |
11 | static final String SENDER_ID = "4815162342" ; |
3 – En eclipse: run > Debug as > Android Aplication (tener ya configurado el emulador con android 2.2 o superior)
Deberíamos ver:
4 – Refresh en el browser:
5 – Presionamos en Send Message
Ya tenemos todo listo, el device registrado en el server y el device listo para recibir mensajes!! Espero les sirva!!