7

私は GCM について読んでいますが、同時にドキュメント(extras/google/gcm/gcm-server/)とにあるサンプル コードを試していますextras/google/gcm/gcm-client/

クライアント(デバイス)の登録プロセスは正常に機能しています。しかし、登録済みのデバイスにメッセージを送信しようとすると、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)

注: SendAllMessagesServlet.java:75 にコメントを追加しました。上記のコードを参照してください。

複数の場合

Error sending message to device #0: Unavailable 

この問題を解決するにはどうすればよいですか?

4

5 に答える 5

2

このリンクの手順に従ってください。私はこのリンクで作業を行っており、その作業はうまくいきます

http://lalit3686.blogspot.in/2012/07/android-steps-to-run-gcm-demo.html

于 2012-08-07T12:36:36.913 に答える
0

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

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

ant war

デバイスを登録してメッセージを送信するプロセスを再試行してください。

于 2012-07-18T15:50:24.793 に答える
0

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

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

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

于 2013-11-04T12:38:34.850 に答える
0

これが役立つかどうかはわかりませんが、401に関しては、ドキュメントによると

「401: 送信者の検証に使用された ClientLogin AUTH_TOKEN が無効であることを示します。」

于 2012-07-17T14:17:34.593 に答える