1

尝试从我的应用服务器向 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)

这就是我的问题

4

4 回答 4

1

您的 AIzaSyCd9HdSlq51nLzoqxMaFLsxWaoxxIz6-bU 的问题 - 使用另一个。

于 2012-08-23T11:58:07.983 回答
1

虽然选择了上面的答案,但我相信这是原因。

https://code.google.com/p/gcm/issues/detail?id=7

该问题已在 master 中修复,但 SDK 中的 jar 已过时。

于 2013-03-03T02:11:37.017 回答
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();
    }
}
于 2012-08-23T12:00:54.823 回答
1

GCM 服务器返回类似“401 Unauthorized”的错误,但 GCM 代码中有一个错误,它会抛出 thisIllegalArgumentException而不是预期的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所做的更改,它似乎仍然会是一个问题。

于 2013-07-05T14:41:23.610 回答