0

数日前は、データベースに約 1000 個のデバイス トークンがあったため、Android デバイスのプッシュ通知は正常に機能していましたが、現在は約 1500 個のデバイス トークンに達しているため、機能していません。java.io.IOExceptionサーバー側に入ります。

java.io.IOException: Server returned HTTP response code: 400 for URL: https://android.googleapis.com/gcm/send
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1491)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1485)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1139)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:363)
    at com.google.android.gcm.server.Sender.send(Sender.java:261)
    at com.orange.server.ws.androidpns.androidPNHandler.run(androidPNHandler.java:58)
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: https://android.googleapis.com/gcm/send
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
    at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
    at com.google.android.gcm.server.Sender.sendNoRetry(Sender.java:362)
    ... 2 more

1 つのデバイス トークンを確認したところ正常に動作しましたが、データベース テーブルに多数のデバイス トークン (>800) がある場合、上記の例外が発生します。GCM のサーバー コードを次に示します。

Sender sender = new Sender("SENDER-ID");
AndroidPNSEntityHandler androidPNSEntityHandler = new AndroidPNSEntityHandler();
ArrayList<String> androidDeviceIds = androidPNSEntityHandler.getList();

/* I checked by adding only one device token to this arraylist like
this **androidDeviceIds.add("Android-Device-Token");**
It worked fine...
*/

if(androidDeviceIds.size() != 0)
{
    String title;
    if(!isOrangeCall)
        title = "title";
    else
        title = "oTitle";

    Message message = new Message.Builder()
                .collapseKey(pnsCollapseKey)
                .timeToLive(86400)
                .addData(title,msgTitle)
                .addData("content",msgContent)
                .build();
    try
    {
        MulticastResult result = sender.send(message, androidDeviceIds, 5);
        if (result.getResults() != null) 
        {
            int failureMsgs = result.getFailure();
            int canonicalRegId = result.getCanonicalIds();
            List<Result> multicastResults = result.getResults();
            Boolean flag =true;
            int total;
            if(failureMsgs != 0 || canonicalRegId != 0)
            {

                for(total = 0;flag;total++)
                {
                    if(canonicalRegId != 0)
                    {
                        String tempCanId = multicastResults.get(total).getCanonicalRegistrationId(); 
                        if( tempCanId != null)
                        {
                            if(androidPNSEntityHandler.deleteDuplicate(androidDeviceIds.get(total), tempCanId))
                                canonicalRegId--;
                        }
                    }
                    if(failureMsgs != 0)
                    {
                        if(multicastResults.get(total).getErrorCodeName().equals(Constants.ERROR_NOT_REGISTERED))
                        {
                            if(androidPNSEntityHandler.deleteUid(androidDeviceIds.get(total)));
                            failureMsgs--;
                        }
                    }
                    if(canonicalRegId == 0 && failureMsgs == 0)
                        flag = false;
                }

            }

        }

    }catch (java.lang.IllegalArgumentException e)
    {
        e.printStackTrace();
    }catch (InvalidRequestException e)
    {
        e.printStackTrace();
    }catch (java.io.IOException e)
    {
        e.printStackTrace();
    }catch (Exception e) 
    {
        e.printStackTrace();
    }
}

この問題を解決するために私を導いてください...

4

1 に答える 1

0

ドキュメントは 、1000が限界であることを明確にしています:

登録ID

メッセージを受信するデバイス (登録 ID) のリストを含む文字列配列。少なくとも 1 つ、最大で 1000 の 登録 ID が含まれている必要があります。マルチキャスト メッセージを送信するには、JSON を使用する必要があります。1 つのメッセージを 1 つのデバイスに送信するには、登録 ID が 1 つだけの JSON オブジェクトまたはプレーン テキストを使用できます (以下を参照)。必須。

于 2012-10-29T16:03:00.010 に答える