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

読み取り応答部分に問題があります。次のようになります:

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

上記の答えが選ばれましたが、これが原因だと思います。

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

この問題はmasterで修正されていますが、SDKのjarは古くなっています。

于 2013-03-03T02:11:37.017 に答える
1

GCMサーバーは「401Unauthorized」のようなエラーを返しますが、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リリースのものです。最新のGCMGITリポジトリhttps://code.google.com/p/gcm/issues/detail?id=7に関連する修正がありますが、 Senderに加えられた変更を見ると、それでもそうなるようです。問題。

于 2013-07-05T14:41:23.610 に答える