मैं जीसीएम के बारे में पढ़ रहा हूं और साथ ही मैं दस्तावेज़ (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
मैं कैसे इस समस्या को हल कर सकते हैं?
वहाँ वैध deviceIds डेटासंग्रह में मौजूद हैं ?? –
मैं उन्हें कैसे पहचान सकता हूं? आम तौर पर यह वही स्ट्रिंग या स्ट्रिंग्स की सूची होती है जिसे डिवाइस द्वारा भेजा गया था क्योंकि उनकी डिवाइस आईडी जीसीएम से लौटा दी गई थी। –
Google समूह चर्चा: https://groups.google.com/forum/#!topic/android-gcm/ew9quCXJSjQ –