Мне сложно получать сообщения через c2dm. На самом деле иногда я получаю сообщения с нашего сервера, но это буквально только половина данных. (Я ожидаю 4-значное число и получил только первые 2 цифры .. oO "). Однако в последнее время наш широковещательный приемник оставался абсолютно бесшумным. Поэтому я начал экспериментировать и нажимать свои собственные сообщения c2dm на сервер google, чтобы увидеть, как вещь делают.c2dm сообщения никогда не были получены
в нижней части сообщения, вы можете найти пример класса, как отправлять и принимать C2DM сообщения. все это в значительной степени самостоятельным, так что вы можете подключить его к какой-либо деятельности и отстрел C2dmStaticTest.autopilot(yourSenderId, "foo bar", yourServerSideAuthCode, this, this.getPackageName());
Позвольте мне наметить, что происходит:
- Настройка статических переменных используемый в BroadcastReceiver
- Регистрация вещательного приемника и настройка действий и категорий, как это было бы в
androidManifest.xml
в противном случае. - Отправка задачи регистрации на сервер c2dm.
Примечание: Местный встроенный приемник будет генерировать сообщение журнала для каждого полученного намерения! Каждый раз, когда в классе выдается сообщение журнала, тег будет «c2dmTest».
При получении ответа c2dm с регистрационным_идом также будет зарегистрировано и , после чего будет нажата c2dm-сообщение.
Я моделирую здесь наш сервер как можно ближе, чтобы получить больше контроля. В качестве повторного теста я также выдаю сообщение fakeC2DM, которое имитирует фактическое намерение и тестирует широковещательный приемник для функциональности в действии RECEIVE.
Хотя я могу получить токен регистрации с сервера c2dm, я не получаю никаких сообщений, которые я нажал на сервер. Как упоминалось во введении, я наблюдаю такое же поведение, когда наш веб-сервер отправляет сообщения.
Я старался изо всех сил, и я уверен, что я внедрил широковещательный приемник соответственно, и поскольку код ответа сервера для отправки сообщений всегда 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);
}
}