2012-07-04 20 views
7

私はGCMについて読んでいますが、同時にサンプルコード(extras/google/gcm/gcm-server/)extras/google/gcm/gcm-client/で試してみます。サーバーからメッセージを投稿できません:Google Cloud Messaging

クライアント(デバイス)の登録プロセスが正常に動作しています。しかし、登録されたデバイスにメッセージを送信しようとすると、1つのデバイスが追加されたり、複数のデバイスがサーバーに追加されたりしてもエラーが表示されます。

@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(); 
    } 

注:ここでは

がコードでコードがドキュメントに与えられたと同じであり、私はちょうどgetMessage()を追加しました。

1つのデバイスが

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) 

NOTE登録したとき、私はコンソールにエラーが発生しました:SendAllMessagesServlet.java:75へ追加のコメントを。上記のコードを参照してください。

と、複数の

Error sending message to device #0: Unavailable 

どのように私はこの問題を解決することができますか?

+0

が有効deviceIdsは、データストア内に存在しているAndroidアプリケーションについては、ブラウザのキーを生成するthis guideに従うことができます? –

+0

どうすればそれらを識別できますか?一般的に、これは、デバイスIDがGCMから返されるため、デバイスによって送信された文字列または文字列のリストと同じです。 –

+1

Googleグループディスカッション:https://groups.google.com/forum/#!topic/android-gcm/ew9quCXJSjQ –

答えて

0

私は「401:ClientLoginのAUTH_TOKENは、送信者が無効で検証するために使用されていることを示します。」これが役立つかどうかわからないんだけど、に関して401、the docs say

0

Google APIコンソールでは、ブラウザアプリケーションキー(ドキュメントの例はブラウザアプリケーション)とサーバーアプリケーションのキーを使用していることを確認してください。再び

ant war 

を使用して新しいキーを使用して、warファイルのプロジェクトを生成して、デバイスを登録してメッセージを送信し、再度処理を試してみてください。

0

このリンクにより、作業とその作業罰金を持って、必ずブラウザアプリケーションキーを使用します。このlink.Iの手順に従ってくださいドキュメンテーションの例はブラウザアプリケーションです)とサーバーアプリケーションのキーです。

次に、新しいキーを使用してwarファイルプロジェクトを再生成します。

デバイスを登録してメッセージを送信して、もう一度プロセスを試行してください。

3

あなたは

関連する問題