1

JSON GCMメッセージを送受信しようとしていますが、クライアントでは常にUTF8として送信されているようです。

protected HttpURLConnection post(String url, String contentType, String body)
throws IOException {
    Print.logInfo("In HttpURLConnection: " + contentType + body);
    byte[] bytes = body.getBytes();
    HttpURLConnection conn = getConnection(url);
    conn.setDoOutput(true);
    conn.setUseCaches(false);
    conn.setFixedLengthStreamingMode(bytes.length);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", contentType);
    conn.setRequestProperty("Authorization", "key=" + key);
    OutputStream out = conn.getOutputStream();
    out.write(bytes);
    out.close();
    return conn;
}

サーバーでは、UTF8メッセージは次のとおりです。HttpURLConnection:application / x-www-form-urlencoded; charset = UTF-8registration_id = APA91 ...&delay_while_idle = 0&collapse_key = Test&time_to_live = 2419200&data.Data1 = Value + 1&data.Data2 = Value + 2&data .Data3 = Value + 3

JSONメッセージは次のとおりです。HttpURLConnection:application / json {"delay_while_idle":false、 "collapse_key": "Test"、 "data":{"Data1": "Value 1"、 "Data2": "Value 2"、 "Data3": "Value 3"}、 "time_to_live":2419200、 "registration_ids":["APA91 ..."]}

マルチキャスト結果付きMulticastResult(multicast_id = 5036 ...、total = 1、success = 1、failure = 0、canonical_ids = 0、results:[[messageId = 0:1362 ..]]:

両方のメッセージがクライアントで正常に受信されましたが、json形式を認識できません。

@Override
protected void onMessage(Context context, Intent intent) {
    Log.i(TAG, "Received message");
    String inAction = intent.getAction();
    // check to see if it is a message
    if (inAction.equals("com.google.android.c2dm.intent.RECEIVE")) {
        // if your key/value is a JSON string, extract and parse it using JSONObject
        String json_info = intent.getExtras().getString("data");
        if (json_info != null) {
            try {
                JSONObject jsonObj = new JSONObject(json_info);
                payload = jsonObj.get("Data1")  + "\n"
                        + jsonObj.get("Data2")+ "\n"
                        + jsonObj.get("Data3");
                }
            catch (JSONException e) {
                // do nothing
                return;
            }
        }
        else {
            payload = intent.getStringExtra("Data1")  + "\n"
                    + intent.getStringExtra("Data2")+ "\n"
                    + intent.getStringExtra("Data3");
            }
    }
}

どちらの場合も、json_infoはnullです。apache/tomcatを実行しているサーバーでJavaサーブレットを使用しています。

助けてください。どうもありがとう

4

1 に答える 1

5

JSON オブジェクトは、サーバーと GCM サーバーとの通信でのみ使用されます。アプリが JSON オブジェクトを取得することはありません。通知のデータは、キーと値のペアとして渡されます。何らかの理由で JSON ペイロードを渡したい場合は、それを文字列としてエンコードし、その文字列をdataJSON オブジェクト内のキーと値のペアのいずれかの値として渡す必要があります。次に、インテントのエクストラからその値を読み取り、JSON を解析する必要があります。

onMessage(Context context, Intent intent): サーバーがメッセージを GCM に送信し、GCM がそれをデバイスに配信するときに呼び出されます。メッセージにペイロードがある場合、そのコンテンツはインテントのエクストラとして利用できます。

実際には、この引用はより関連性があります:

データ

メッセージのペイロード データのキーと値のペアを表すフィールドを持つ JSON オブジェクト。存在する場合、ペイロード データはアプリケーション データとしてインテントに含まれ、キーはエクストラの名前になります。たとえば、"data":{"score":"3x1"} は、値が文字列 3x1 であるスコアという名前のインテント エクストラになります。メッセージの合計サイズ (4kb) には制限がありますが、キーと値のペアの数に制限はありません。値は任意の JSON オブジェクトにすることができますが、値はいずれにしても GCM サーバーで文字列に変換されるため、文字列を使用することをお勧めします。オブジェクトまたはその他の非文字列データ型 (整数やブール値など) を含めたい場合は、自分で文字列に変換する必要があります。また、キーを予​​約語 (from または google. で始まる任意の単語) にすることはできません。少し複雑なことに、ペイロード データで技術的に許可されている予約語 (collapse_key など) がいくつかあります。ただし、リクエストに単語も含まれている場合は、リクエストの値によってペイロード データの値が上書きされます。したがって、技術的に許可されている場合でも、この表でフィールド名として定義されている単語を使用することはお勧めしません。オプション。技術的に許可されている場合でも。オプション。技術的に許可されている場合でも。オプション。

于 2013-03-10T00:03:22.737 に答える