2012-07-04 11 views
7

मैं जीसीएम के बारे में पढ़ रहा हूं और साथ ही मैं दस्तावेज़ (extras/google/gcm/gcm-server/) और extras/google/gcm/gcm-client/ में दिए गए नमूना कोड का प्रयास कर रहा हूं।सर्वर से संदेश पोस्ट करने में सक्षम नहीं: Google क्लाउड मैसेजिंग

ग्राहक (डिवाइस) की पंजीकरण प्रक्रिया ठीक काम कर रही है। लेकिन जब मैंने पंजीकृत डिवाइस पर संदेश भेजने की कोशिश की तो मुझे त्रुटि दे रही है, भले ही एक डिवाइस जोड़ा गया हो या सर्वर में एक से अधिक डिवाइस जोड़े गए हों।

यहाँ कोड है:

@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() गयी। जोड़ा गया SendAllMessagesServlet.java:75 टिप्पणी:

मैं जब एक डिवाइस पंजीकृत

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) 

नोट कंसोल पर एक त्रुटि मिली। उपरोक्त कोड देखें।

और जब एक से अधिक

Error sending message to device #0: Unavailable 

मैं कैसे इस समस्या को हल कर सकते हैं?

+0

वहाँ वैध deviceIds डेटासंग्रह में मौजूद हैं ?? –

+0

मैं उन्हें कैसे पहचान सकता हूं? आम तौर पर यह वही स्ट्रिंग या स्ट्रिंग्स की सूची होती है जिसे डिवाइस द्वारा भेजा गया था क्योंकि उनकी डिवाइस आईडी जीसीएम से लौटा दी गई थी। –

+1

Google समूह चर्चा: https://groups.google.com/forum/#!topic/android-gcm/ew9quCXJSjQ –

उत्तर

0

मुझे यकीन है कि अगर यह मदद मिलेगी नहीं कर रहा हूँ, लेकिन संबंध 401, साथ the docs say

"401: यह दर्शाता है कि ClientLogin AUTH_TOKEN मान्य करने के लिए इस अमान्य है इस्तेमाल किया।"

0

Google API के कंसोल में, सुनिश्चित करें कि आप ब्राउज़र एप्लिकेशन कुंजी का उपयोग करें (दस्तावेज़ीकरण का उदाहरण एक ब्राउज़र एप्लिकेशन है) और सर्वर अनुप्रयोगों के लिए एक कुंजी।

फिर

ant war 

का उपयोग कर नए कुंजी का उपयोग और इस प्रक्रिया पुन: प्रयास करें, डिवाइस को पंजीकृत और संदेश भेजने के युद्ध फ़ाइल परियोजना उत्पन्न करता है।

0

गूगल API's कंसोल इस लिंक और उसके काम ठीक से काम किया है, सुनिश्चित करें कि आप एक ब्राउज़र आवेदन कुंजी का उपयोग कर (के रूप में दस्तावेज़ीकरण का उदाहरण एक ब्राउज़र अनुप्रयोग है) और सर्वर अनुप्रयोगों के लिए एक कुंजी है।

फिर, नई कुंजी का उपयोग कर युद्ध फ़ाइल प्रोजेक्ट को पुन: उत्पन्न करें।

डिवाइस को पंजीकृत करके और संदेश भेजकर फिर से प्रक्रिया का प्रयास करें।

3

आप this guide पालन कर सकते हैं Android एप्लिकेशन के लिए आपके ब्राउज़र कुंजी उत्पन्न करने के

संबंधित मुद्दे