を受けたことはありません。実際に私のサーバーからメッセージが届くこともありますが、文字通りデータの半分に過ぎません。 (私は4桁の数字を期待していして「○○..のみ最初の2桁を受けた)。 しかし最近、当社の放送受信機は、サイレント絶対残っていた。したがって、私は実験を開始し、どのように確認するために、Googleのサーバーに自分のC2DMメッセージをプッシュ事のあなたは、私が送信方法の例のクラスを見つけて、C2DMメッセージを受け取ることができますポストの下部に。C2DMのメッセージは、私がC2DM介してメッセージを受信苦労してる
を行っている。それはとてもあなたがC2dmStaticTest.autopilot(yourSenderId, "foo bar", yourServerSideAuthCode, this, this.getPackageName());
私は何が起こっているか概要を説明しましょう:
- 静的変数を設定する放送受信機を登録し、それ以外
androidManifest.xml
にされてしまうかのアクションとカテゴリを設定するBroadcastReceiver - で使用。
- サーバーをC2DMへの登録の意図を送信します。
注意:ローカルのビルド済みのブロードキャスト受信者は、受信したすべてのインテントについてログメッセージを生成します。 クラス内でログメッセージが発行されるたびに、タグは「c2dmTest」になります。
registration_idでc2dmの回答を受け取ると、これもログに記録され、 になり、c2dmメッセージがプッシュされます。
私はここで私のサーバーをモデリングしています。 私はバックテストとして、実際のインテントと似ているfakeC2DMメッセージを発行し、RECEIVEアクションの機能についてブロードキャストレシーバをテストします。
私は私がサーバーにプッシュ任意のメッセージを受信していないよC2DMサーバからの登録トークンを受け取ることができますが。序文で述べたように、Webサーバーがメッセージを送信しているときと同じ動作を観察します。
私は私の非常に最高のを試してみましたが、私はまた、メッセージがサーバーに正常に配信されると信じて、私はそれに応じて放送受信機を実装しましたし、メッセージ送信するためのサーバ応答コードは常にOK 200 /であるから確信しています。
しかし、結果は期待されたものではありませんが、私は他に何ができるか考えていません。 「メッセージの配信は保証されていません」のようなパッセージを見つけることは奨励していません。私は今、何もすべてで配信されていない意味:status code: 200
はデータだけでセマンティックエラーがあったかもしれない通信が成功したことを示していないことを私は学んだ私たちのサーバーの人にこれを提示する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);
}
}