2012-07-04 13 views
7

Estoy leyendo sobre GCM y al mismo tiempo estoy probando el código de muestra proporcionado en los documentos (extras/google/gcm/gcm-server/) y extras/google/gcm/gcm-client/.No puedo publicar mensajes desde el servidor: Google Cloud Messaging

El proceso de registro del cliente (dispositivo) funciona bien. Pero cuando traté de enviar un mensaje al dispositivo registrado me está dando un error, incluso cuando se agrega un dispositivo o se agrega más de un dispositivo al servidor.

Aquí es código:

@Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
     throws IOException, ServletException { 
    List<String> devices = Datastore.getDevices(); 
    StringBuilder status = new StringBuilder(); 
    if (devices.isEmpty()) { 
     status.append("Message ignored as there is no device registered!"); 
    } else { 
     List<Result> results; 
     // NOTE: check below is for demonstration purposes; a real application 
     // could always send a multicast, even for just one recipient 
     if (devices.size() == 1) { 
     // send a single message using plain post 
     String registrationId = devices.get(0); 
     Result result = sender.send(getMessage(), registrationId, 5); //THIS IS LINE NUMBER 75 
     results = Arrays.asList(result); 
     } else { 
     // send a multicast message using JSON 
     MulticastResult result = sender.send(getMessage(), devices, 5); 
     results = result.getResults(); 
     } 
     // analyze the results 
     for (int i = 0; i < devices.size(); i++) { 
     Result result = results.get(i); 
     if (result.getMessageId() != null) { 
      status.append("Succesfully sent message to device #").append(i); 
      String canonicalRegId = result.getCanonicalRegistrationId(); 
      if (canonicalRegId != null) { 
      // same device has more than on registration id: update it 
      logger.finest("canonicalRegId " + canonicalRegId); 
      devices.set(i, canonicalRegId); 
      status.append(". Also updated registration id!"); 
      } 
     } else { 
      String error = result.getErrorCodeName(); 
      if (error.equals(Constants.ERROR_NOT_REGISTERED)) { 
      // application has been removed from device - unregister it 
      status.append("Unregistered device #").append(i); 
      String regId = devices.get(i); 
      Datastore.unregister(regId); 
      } else { 
      status.append("Error sending message to device #").append(i) 
       .append(": ").append(error); 
      } 
     } 
     status.append("<br/>"); 
     } 
    } 
    req.setAttribute(HomeServlet.ATTRIBUTE_STATUS, status.toString()); 
    getServletContext().getRequestDispatcher("/home").forward(req, resp); 
    } 

    private Message getMessage() { 
     Message.Builder builder = new Message.Builder(); 
     /*Message message = new Message.Builder() 
      .collapseKey(collapseKey) 
      .timeToLive(3) 
      .delayWhileIdle(true) 
      .addData("key1", "value1") 
      .addData("key2", "value2") 
      .build();*/ 
     return builder.build(); 
    } 

Nota: código es el mismo que figura en documentos, me acaba de agregar getMessage().

me dio un error en la consola cuando un dispositivo registrado

SEVERE: Servlet.service() for servlet SendAllMessagesServlet threw exception 
com.google.android.gcm.server.InvalidRequestException: HTTP Status Code: 401 
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:177) 
    at com.google.android.gcm.server.Sender.send(Sender.java:121) 
    at com.google.android.gcm.demo.server.SendAllMessagesServlet.doPost(SendAllMessagesServlet.java:75) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run(Thread.java:662) 

NOTA: Agregado comentario a SendAllMessagesServlet.java:75. ver el código anterior

y cuando más de un

Error sending message to device #0: Unavailable 

¿Cómo puedo resolver este problema?

+0

no son válidos deviceIds presente en el almacén de datos ?? –

+0

¿Cómo puedo identificarlos? En general, esta es la misma cadena o lista de cadenas que fue enviada por el dispositivo a medida que su ID del dispositivo regresó de GCM. –

+1

Discusión en grupo de Google: https://groups.google.com/forum/#!topic/android-gcm/ew9quCXJSjQ –

Respuesta

0

no estoy seguro de si esto ayuda, pero en lo que respecta al 401, the docs say

"401: Indica que el ClientLogin auth_token utiliza para validar el remitente es válido."

0

En la consola de la API de Google, asegúrese de utilizar una clave de aplicación de navegador (como el ejemplo de la documentación es una aplicación de navegador) y una clave para aplicaciones de servidor.

genera nuevo proyecto archivo de la guerra usando la nueva clave usando

ant war 

e intentar de nuevo el proceso, registrar el dispositivo y enviar el mensaje.

0

En el API? S Consola de Google, asegúrese de usar una clave de aplicación del navegador (como se el ejemplo de la documentación es una aplicación de navegador) y una clave para aplicaciones de servidor.

A continuación, vuelva a generar el proyecto del archivo de guerra con la nueva clave.

Intente el proceso de nuevo registrando el dispositivo y enviando el mensaje.

3

puede seguir this guide para generar su clave para la aplicación del navegador de Android

Cuestiones relacionadas