尝试从我的应用服务器向GCM服务器发送消息时,我收到了java.lang.IllegalArgumentException异常。在客户端注册成功。
import java.util.ArrayList;
import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Sender;
class Notify {
public static void main(String args[]) {
try {
Sender sender = new Sender(
"AIzaSyCd9HdSlq51nLzoqxMaFLsxWaoxxIz6-bU");
ArrayList<String> devicesList = new ArrayList<String>();
devicesList.add("APA91bFzbdNTf5CVsnSpkPJxMTCUCnjruluaerQcONQq9f20aaHw1CMNcVFgBsnLd6gUQT5TxrV2WY5WBw9U9u4Paj3dAXgRbaATc9a2Gp0voF3h5elX3Be0r3xw3Kun2HZT1m3D8L6IwCkXtTiILIfVasiKd2uN3w");
devicesList.add("APA91bFzbdNTf5CVsnSpkPJxMTCUCnjruluaerQcONQq9f20aaHw1CMNcVFgBsnLd6gUQT5TxrV2WY5WBw9U9u4Paj3dAXgRbaATc9a2Gp0voF3h5elX3Be0r3xw3Kun2HZT1m3D8L6IwCkXtTiILIfVasiKd2uN3w");
// use this line to send message with payload data
Message message = new Message.Builder()
.collapseKey("1")
.timeToLive(3)
.delayWhileIdle(true)
.addData("message",
"this text will be seen in notification bar!!")
.build();
// Use this for multicast messages
MulticastResult result = sender.send(message, devicesList, 1);
sender.send(message, devicesList, 1);
System.out.println(result.toString());
if (result.getResults() != null) {
int canonicalRegId = result.getCanonicalIds();
if (canonicalRegId != 0) {
}
} else {
int error = result.getFailure();
System.out.println(error);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这就是代码
java.lang.IllegalArgumentException: argument cannot be null
at com.google.android.gcm.server.Sender.nonNull(Sender.java:553)
at com.google.android.gcm.server.Sender.getString(Sender.java:534)
at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:365)
at com.google.android.gcm.server.Sender.send(Sender.java:261)
at com.example.server.Notify.main(Notify.java:34)
这就是我的问题
答案 0 :(得分:1)
您的AIzaSyCd9HdSlq51nLzoqxMaFLsxWaoxxIz6-bU的问题 - 使用另一个。
答案 1 :(得分:1)
阅读响应部分存在问题。应该是这样的:
MulticastResult multiResult = sender.send(message, devicesList, 1);
List<Result> results = multiResult.getResults();
for (int i = 0; i < results.size(); i++) {
Result result = results.get(i);
if (result.getMessageId() != null) {
// Success
String canonicalRegId = result.getCanonicalRegistrationId();
if (canonicalRegId != null) {
// same device has more than one registration id.Update it
}
} else {
// Error occurred
String error = result.getErrorCodeName();
}
}
答案 2 :(得分:1)
答案 3 :(得分:1)
GCM服务器返回类似“401 Unauthorized”的错误,但GCM代码中存在错误,它会抛出此IllegalArgumentException
而不是预期的InvalidRequestException
。您需要附加源,然后在com.google.android.gcm.server.Sender
中的此代码处设置断点,以查看实际的HTTP错误。
int status = conn.getResponseCode();
String responseBody;
if (status != 200) {
responseBody = getString(conn.getErrorStream());
logger.finest("JSON error response: " + responseBody);
throw new InvalidRequestException(status, responseBody);
}
基本上conn.getErrorStream()
在这里返回null
,所以你永远不会看到InvalidRequestException
。
上面的代码来自最新的1.0.2版本。最新的GCM GIT存储库https://code.google.com/p/gcm/issues/detail?id=7中有一个相关的修复程序,但是看看它们对Sender所做的更改,它似乎仍然是一个问题。