2012-07-04 41 views
7

Sto leggendo su GCM e allo stesso tempo sto provando il codice di esempio indicato nei documenti (extras/google/gcm/gcm-server/) e extras/google/gcm/gcm-client/.Impossibile inviare messaggi dal server: Google Cloud Messaging

Il processo di registrazione del client (dispositivo) funziona correttamente. Ma quando ho provato a inviare un messaggio al dispositivo registrato mi dava un errore, anche quando un dispositivo è stato aggiunto o più di un dispositivo è stato aggiunto al server.

Ecco il codice:

@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: il codice è come stessi dato in documenti, Ho appena aggiunto getMessage().

ho ottenuto un errore sulla console quando un dispositivo registrato

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: Aggiunto commento a SendAllMessagesServlet.java:75. vedi sopra il codice.

e quando più di una

Error sending message to device #0: Unavailable 

Come posso risolvere questo problema?

+0

ci sono deviceIds valide presenti nel datastore ?? –

+0

Come posso identificarli? Generalmente si tratta della stessa stringa o lista di stringhe che è stata inviata dal dispositivo come ID dispositivo restituito da GCM. –

+1

Discussione di gruppo di Google: https://groups.google.com/forum/#!topic/android-gcm/ew9quCXJSjQ –

risposta

0

io non sono sicuro se questo aiuterà, ma per quanto riguarda la 401, the docs say

"401: Indica che il ClientLogin auth_token utilizzato per convalidare il mittente non è valido."

0

Nella Console dell'API di Google, assicurarsi di utilizzare una chiave dell'applicazione del browser (come l'esempio della documentazione è un'applicazione del browser) e una chiave per le applicazioni del server.

genera Anche in questo caso il progetto file di guerra, utilizzando la nuova chiave utilizzando

ant war 

e riprovare il processo, la registrazione del dispositivo e l'invio del messaggio.

0

Nel API? Console di Google, assicurarsi di utilizzare una chiave applicazione browser (come l'esempio della documentazione è un'applicazione browser) e una chiave per le applicazioni server.

Quindi, rigenerare il progetto del file di guerra utilizzando la nuova chiave.

Riprovare il processo registrando il dispositivo e inviando il messaggio.

3

è possibile seguire this guide per generare la chiave del browser per l'applicazione Android

Problemi correlati