Hola de nuevo.

Hoy he hecho cambios en la librería, a modo resumen son:

  • He corregido un BUG relativo al observer SMS que hacía que el objeto SMS no
    android-lib-iconestuviera inicializado en la clase SMSRunnableTask.java.
  • Y de paso, he aprovechado a mejorarla un poco, añadiendo una clase Helper para el envío de notificaciones PUSH desde la propia aplicación. Esta clase Helper, llamada “GCMDelivery.java” contiene una serie de métodos estáticos para el envío singular/múltiple de una notificación PUSH con uno o varias keys:
    • void gcm_sendMessageToDevice(String apiKey, Map<String, String> data,
      String collapseKey, boolean delayWhileIdle, int timeToLive,
      String device, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevice(String apiKey, String key, String message, String collapseKey, boolean delayWhileIdle, int timeToLive,
      String device, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevices(String apiKey, String key, String message, String collapseKey, boolean delayWhileIdle, int timeToLive,
      List<String> devices, int retries) throws GCMDeliveryException
    • void gcm_sendMessageToDevices(String apiKey, Map<String, String> data, String collapseKey, boolean delayWhileIdle, int timeToLive,
      List<String> devices, int retries) throws GCMDeliveryException.

Esta clase Helper de envío GCM puede ser usada además en la parte servidora si se gcm-logo-e1357123459595incluyen las dos librerías requeridas por GCMgcm-server.jar” y “json_simple-1.1.jar” (incluídas en el directorio “lib” de la librería).

He documentado cada método muy bien, explicando los parámetros al detalle ya que el tema de los parámetros de envío PUSH, al menos a mí, me parecía un poco complicado de entender del todo (ha sido también el motivo de incluir esta clase de envío). os aconsejo leeros la info de los métodos para aclarar ideas aunque es probable que haga un post al respecto.

Recordad por último, que la apiKey, que es lo que se necesita para enviar mediante GCM, la tenéis explicada en el PDF que adjunta la librería en la carpeta “docs“.

 

github_icon

Como siempre, teneis la librería disponible en GitHub

javocsoft-toolbox.

 

Un saludo.

JavocSoft 2013.

Hola.

Al final me he decidido a publicar en GitHUB la librería que desarrollé para el uso de Google C2DM (Google PUSH notification system aka Cloud to Device Messaging) y que iba a usar en mis aplicaciones. EL motivo es para compartir sin más dicha librería y así, aparte de animaros a usar dicho sistema, conseguir quizás, que la librería mejore en base a aportes colaborativos :).

La he hecho lo más sencilla posible para la v1.0. Esta versión es estable. A día de hoy sigue en desarrollo.

La librería la he dividido en dos, una para la parte servidora y otra para la parte cliente (aplicación Android). Se puede usar una parte u otra aunque esta pensada para usarlas en combinación ya que juntas, permiten implementar de manera fácil cosas como:

  • El envío de información de registro del dispositivo al servidor, dandolo de alta en nuestro sistema.
  • De-registrar una app. de nuestro sistema.
  • Habilitar/Deshabilitar el envío de pushes a dispositivos determinados.
  • Recepción de ACKs (para posibles usos estadísticos) de las Pushes abiertas por el cliente.

Las partes de la librería quedan por tanto tal que:

  • Una librería para la parte servidora llamada AndroidEasyPushServer
    • El código esta bien documentado generándose el JavaDoc correspondiente en el proyecto. Aún así, se puede consultar en la página http://javocsoft.github.com/AndroidEasyPushServer/ su uso. La iré completando con el paso del tiempo e incluso activar la wiki con howtos especificos si veo que puede ser útil.
    • Esta contiene:
      • La librearía propiamente dicha
      • Un server CRUD de ejemplo que hace uso de esta. 
  • Una librería para la parte cliente (dispositivo Android) llamada AndroidEasyPushClient.
    • El código esta ampliamente documentado generándose el JavaDoc correspondiente. La web del proyecto aún no la he creado, cuando la tenga en el GitHUB lo comunicaré.
    • Esta contiene:
      • La librería en sí.
      • Una aplicación Android sencilla que ilustra el uso de la librería permitiendo registrar con Google C2DM el dispositivo, recibir una push, etc.

Ambas partes de la librería, parte servidora y cliente, estan Mavenizadas (incluso el proyecto de servidor CRUD de prueba). Lo único no Mavenizado es el proyecto de prueba Android, aún así, como esta realizado en Eclipse, tan solo se ha de importar el proyecto al IDE.

Haciendo esta librería me dí cuenta de un par de peculiaridades que me costó descubrir en su momento y que os comento para que no os pase si tampoco lo sabíais:

  • Cuando se trata de acceder desde una app. móvil a localhost(tu pc), la ip a poner no es la 127.0.0.1 ya que esta es la del propio dispositivo sino 10.0.2.2 (esto ya esta establecido en la app. de prueba incluida en la librería cliente). 
  • Cuando se testea y se trata de acceder a tu localhost, tu pc, donde tienes corriendo un servicio en un servidor, el servidor, si utilizais Eclipse al menos, se ha de lanzar fuera de Eclipse. En caso de no hacerlo, el emulador, por ejemplo, no podrá acceder a la parte servidora (aunque indiqueis la dirección ip correcta 10.0.2.2).  

También me gustaría comentaros algunas cosas sobre el sistema de Google para el envío y recepción de notificaciones PUSH, aka C2DM:

Si deseais más información sobre dicho sistema podeis ir a http://code.google.com/intl/es-ES/android/c2dm/.

Bueno, a aquellos que se decidan por usar el sistema PUSH de Google, sea usando mi librería o no, ánimo!

Un saludo,

JavocSoft 2012.

Hola,

  Hace un tiempo que quería aprender a usar el sistema de notificaciones de Android pero no sabía como usarlo ni para que aplicarlo a la aplicación pero hoy, se me ha ocurrido que estaría bien que la aplicación revisara de manera automática(configurable) las partidas de nuestros foros preferidos y que nos lo notificara, en caso de encontrar nuevos eventos, en la barra de estado.

Asi que me he puesto a ello y he decidido compartirlo con vosotros por si os ayuda de cara a realizar algo similar :).

  En principio, iba a crear un servicio que ejecutara tal chequeo en segundo plano cada x tiempo pero, he visto que no hacía falta gracias a que ya existe una clase para tal objetivo llamada ScheduledExecutorService que hace justo eso, crear un pool de hilos que se ejecutan cada x tiempo a través de un proceso runnable.

Asi que una vez salvado este escollo, solo quedaba usar el sistema de notificaciones de Android. Me ha sorprendido gratamente, como suele ser habitual en este sistema, ver lo bien montado que Google tiene el sistema para la gestión de notificaciones y, lo cómodo que es crear y gestionarlas :).

Cada notificación:

  • Tiene una información breve que es la que se muestra cuando surge.
  • Tiene una información mas detallada que se muestra cuando el usuario despliega dicha notificación.
  • Se le asocia un tipo especial de Intent, PendingIntent, que lo que hace es contener la acción, Intent, que se desea que se lance una vez el usuario selecciona la notificación de la barra de estado del terminal. Si no se quiere que se lance acción alguna, no hay mas que no pasarle ninguna accion al objeto PendingIntent. PendingIntent poseé ademas una serie de flags que nos permiten personalizar su comportamiento.
  • Posee una flags que permiten personalizar desde el sonido hasta el color de la luz de notificación.

Una vez tenemos la notificación, no hay mas que enviarla al servicio de notificaciones para que la muestre al usuario,  asignándole un ID por si quisiéramos luego hacer referencia a ella.

Como veis, bastante completo y sencillo.

Lo único que he encontrado extraño, ha sido el caso de que una aplicación requiera mostrar n notificaciones diferentes, cada una ejecutando una acción con unos parámetros determinados. En dicho caso, siguiendo las instrucciones del SDK no funciona. Para arreglar esto, se ha de utilizar el método setAction(String action) del Intent que lanza el PendingIntent, indicando en “action” un valor diferenciante para que así el servicio de notificaciones pueda distinguir entre ellas. Si no se hace de esta manera, cuando el usuario pulse en cualquiera de las notificaciones de nuestra aplicación, Android ejecutará la acción de la primera notificación creada, obviando el resto :(.

Bueno, espero que os sirva de ayuda este mini-howto y vereis funcionando esto en la siguiente versión de la aplicación :).

Un saludo, ciao.