0

c2dm経由でメッセージを受信するのに苦労しています。実際、サーバーからメッセージを受信することがありますが、それは文字通りデータの半分にすぎません。(私は4桁の数字を期待していて、最初の2桁しか受信しませんでした。.oO ")しかし、最近、私たちの放送受信機は完全に無音のままでした。やっている。

投稿の下部に、c2dmメッセージを送受信する方法のサンプルクラスがあります。それはすべてほとんど自立しているので、あなたはそれをいくつかの活動に接続して撮影することができますC2dmStaticTest.autopilot( yourSenderId, "foo bar", yourServerSideAuthCode, this, this.getPackageName());

何が起こっているのかを概説しましょう:

  • BroadcastReceiverで使用される静的変数の設定
  • 放送受信機を登録し、それ以外の場合のアクションとカテゴリを設定しandroidManifest.xmlます。
  • c2dmサーバーに登録インテントを送信します。

注意:ローカルの組み込みブロードキャストレシーバーは、受信したインテントごとにログメッセージを生成します。クラスでログメッセージが発行されるたびに、タグは「c2dmTest」になります。

register_idでc2dm応答を受信すると、これもログに記録され、c2dmメッセージがプッシュされます。
ここでは、より多くの制御を取得するために、サーバーを可能な限り近くでモデリングしています。バックテストとして、実際のインテントを模倣したfakeC2DMメッセージを発行し、RECEIVEアクションの機能についてブロードキャストレシーバーをテストします。

c2dmサーバーから登録トークンを受信できますが、サーバーにプッシュしたメッセージを受信して​​いません。はじめに述べたように、Webサーバーがメッセージを送信しているときも同じ動作を観察します。

私は最善を尽くし、それに応じてブロードキャストレシーバーを実装したと確信しています。また、メッセージ送信のサーバー応答コードは常に200 / OKであるため、メッセージはサーバーに正常に配信されると思います。

しかし、結果は期待されたものではありませんが、私は他に何ができるかについてのアイデアを本当に欠いています。「メッセージ配信は保証されていません」のようなパッセージを見つけることも、励みになりません。つまり、今は何も配信されていません:C

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;

import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.util.Log;

public class C2dmStaticTest {


    private static String       RECEIVE         = "com.google.android.c2dm.intent.RECEIVE";
    private static String       REGISTER        = "com.google.android.c2dm.intent.REGISTER";
    private static String       REGISTRATION    = "com.google.android.c2dm.intent.REGISTRATION";

    private static Context      ctx;
    private static String       packageName;
    private static String       message;
    private static String       auth_code;

    private static IntentFilter mIntFilt        = new IntentFilter();

    //@formatter:off
    private static BroadcastReceiver mBroadRec = new BroadcastReceiver() {

        @Override
        public void onReceive( Context context, Intent intent ) {
            final String broadcastAction = intent.getAction();
            C2dmStaticTest.log("localReceiver onReceive for action: "+ broadcastAction);

            if (C2dmStaticTest.REGISTRATION.equals(broadcastAction)) {
                //execution continues here upon arrival of registration_id
                String registration_id = intent.getStringExtra("registration_id");
                C2dmStaticTest.log("registered for c2dm.\n key is: "+registration_id);


                C2dmStaticTest.log("==> start real self test");
                selfTestC2DM(registration_id, message, auth_code);
                C2dmStaticTest.log("<== real self test done");


                C2dmStaticTest.log("==> start fake test");
                selfTestFake();
                C2dmStaticTest.log("<== fake test done");

                C2dmStaticTest.log("<~~ bye");

            } else if (C2dmStaticTest.RECEIVE.equals(broadcastAction)) {
                C2dmStaticTest.log("Received message: " + intent.getStringExtra("message") );
            }
        }
    };
    //@formatter:on

    public static void autopilot( String sender_id, String message, String auth_code, Context ctx, String packageName ) {
        // setup static variables
        C2dmStaticTest.ctx = ctx;
        C2dmStaticTest.packageName = packageName;
        C2dmStaticTest.message = message;
        C2dmStaticTest.auth_code = auth_code;

        C2dmStaticTest.log("==> register broadcastReceiver");
        mIntFilt.addAction("com.google.android.c2dm.intent.RECEIVE");
        mIntFilt.addAction("com.google.android.c2dm.intent.REGISTRATION");
        mIntFilt.addCategory(packageName);
        ctx.registerReceiver(mBroadRec, mIntFilt);

        C2dmStaticTest.log("==> register for c2dm");
        C2dmStaticTest.registerForC2dm(ctx, sender_id);
        // will continue in localBroadCastReceiver on Receive for REGISTRATION
    }

    private static void registerForC2dm( Context ctx, String sender_id ) {
        Intent registrationIntent = new Intent(C2dmStaticTest.REGISTER);
        registrationIntent.putExtra("app", PendingIntent.getBroadcast(ctx, 0, new Intent(), 0)); // boilerplate
        registrationIntent.putExtra("sender", sender_id);
        ctx.startService(registrationIntent);
    }

    private static void selfTestFake() {
        Intent intent = new Intent();
        intent.setAction(C2dmStaticTest.RECEIVE);
        intent.putExtra("message", "Bender: \"kiss my shiny metal ass!\"");
        intent.addCategory(C2dmStaticTest.packageName);
        C2dmStaticTest.ctx.sendBroadcast(intent);
    }

    public static void selfTestC2DM( String registration_id, String message, String auth_code ) {

        // create HttpClient
        HttpClient mHttpClient = new DefaultHttpClient();

        // create HttpPost
        final HttpPost post = new HttpPost("https://android.apis.google.com/c2dm/send");
        post.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
        post.addHeader("Authorization", "GoogleLogin auth=" + auth_code);

        // set payload data ...
        final List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("registration_id", registration_id));
        nameValuePairs.add(new BasicNameValuePair("collapse_key", "foo"));
        nameValuePairs.add(new BasicNameValuePair("data.message", message));

        // ... and push it in the post
        try {
            post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        } catch (final Exception e) {
            e.printStackTrace(); // never had a problem here
        }

        // start it!
        try {
            HttpResponse resp = mHttpClient.execute(post);
            if (resp.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                // now the message should be send, not?
                C2dmStaticTest.log("Message send.\nServer response: " + resp.getStatusLine().getStatusCode());
            } else {
                C2dmStaticTest.log("Unexpected Server response.\nServer response: " + resp.getStatusLine().getStatusCode());
            }
        } catch (final Exception e) {
            C2dmStaticTest.log("Unexpected Exception in execute()");
            e.printStackTrace();

        }
    }

    public static void log( String message ) {
        Log.d("c2dmTest", message);
    }
}
4

1 に答える 1

0

OK、これをサーバーの人々に提示するstatus code: 200と、通信が成功したことを示しているだけであり、データに意味上のエラーがあった可能性があることを示しているわけではないことを学びました。

このシナリオでは、実際には、キーが一致しないというエラーを示すJSONObjectも受け取りました。
それは私がすべてのレベルでコミュニケーションの問題と呼んでいるものです...

于 2012-05-03T19:45:25.810 に答える