我已經編寫了一個使用C2DM的應用程序。我可以註冊設備併發送消息,但是我收到的設備突然未註冊,因此停止接收消息。我認爲我可以用下面的代碼來處理這個問題,但是看起來沒有收到「未註冊」的意圖(這沒有被確認,但是設備沒有被重新註冊)。c2dm設備自動註銷
我的問題是這是正常的設備是未註冊的藍色?如果是,則發送到設備的「取消註冊」消息?如何在不中斷服務的情況下處理此問題?其他人是否也遇到過這種情況?我可以通過讓用戶在應用程序中按下一個按鈕來重新註冊來處理這個問題,但除非必須,否則我不想這樣做。也考慮過在服務器上保存設備的狀態(註冊,未註冊),然後定期檢查應用程序是否仍在註冊。
任何幫助,將不勝感激!
public class MyC2dmReceiver extends BroadcastReceiver {
private static String KEY = "c2dmPref";
private static String REGISTRATION_KEY = "registrationKey";
SharedPreferences prefs;
private Context context;
@Override
public void onReceive(Context context, Intent intent) {
this.context = context;
if (intent.getAction().equals(
"com.google.android.c2dm.intent.REGISTRATION")) {
handleRegistration(context, intent);
} else if (intent.getAction().equals(
"com.google.android.c2dm.intent.RECEIVE")) {
handleMessage(context, intent);
}
}
private void handleRegistration(Context context, Intent intent) {
final SharedPreferences sharedPrefs = Util.getSharedPreferences(this.context);
String email = sharedPrefs.getString(Util.ACCOUNT_NAME, "");//
prefs = context.getSharedPreferences(KEY, Context.MODE_PRIVATE);
//String email = prefs.getString("email_for_c2dm", "");//
String registration = intent.getStringExtra("registration_id");
if (intent.getStringExtra("error") != null) {
// Registration failed, should try again later.
Log.d("c2dm", "registration failed");
String error = intent.getStringExtra("error");
if (error == "SERVICE_NOT_AVAILABLE") {
Log.d("c2dm", "SERVICE_NOT_AVAILABLE");
} else if (error == "ACCOUNT_MISSING") {
Log.d("c2dm", "ACCOUNT_MISSING");
} else if (error == "AUTHENTICATION_FAILED") {
Log.d("c2dm", "AUTHENTICATION_FAILED");
} else if (error == "TOO_MANY_REGISTRATIONS") {
Log.d("c2dm", "TOO_MANY_REGISTRATIONS");
} else if (error == "INVALID_SENDER") {
Log.d("c2dm", "INVALID_SENDER");
} else if (error == "PHONE_REGISTRATION_ERROR") {
Log.d("c2dm", "PHONE_REGISTRATION_ERROR");
}
} else if (intent.getStringExtra("unregistered") != null) {
// unregistration done, new messages from the authorized sender will
// be rejected
Log.d("c2dm", "unregistered");
SharedPreferences c2dmPrefs=context.getSharedPreferences(KEY, Context.MODE_PRIVATE);
c2dmPrefs.edit().putString("registrationKey", "");
c2dmPrefs.edit().commit();
//RegisterDevice launches the registration intent to get a new regKey
RegisterDevice register=new RegisterDevice(FirefighterLog.getInstance());
} else if (registration != null) {
Log.d("c2dm", registration);
updateServerRegId(registration)) //sends regID to server and stores
Editor editor = context.getSharedPreferences(KEY,
Context.MODE_PRIVATE).edit();
editor.putString(REGISTRATION_KEY, registration);
editor.commit();
Toast.makeText(context, "Device registered successfully",
Toast.LENGTH_LONG);
}
注意:updateServerRegId()將新的regID發送到服務器,並覆蓋它是否已經存在。我正在使用RequestFactory並將它作爲實體發送給appengine。
Android清單:
<uses-permission android:name="com.xxx.someapp.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.xxx.someapp.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<receiver android:name=".C2DM.MyC2dmReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<!-- Receive the actual message -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.xxx.someapp" />
</intent-filter>
<!-- Receive the registration id -->
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.xxx.someapp" />
</intent-filter>
</receiver>
初次註冊後多久纔會發生這些「註銷」?幾小時,幾天,幾周? – Squonk 2012-03-20 19:01:59
您可以在C2DM接收器定義的位置發佈您的Android清單嗎? – 2012-03-20 19:03:44
@MisterSquonk時間似乎有所不同,但通常是幾周。我沒有足夠的測試來確切地知道。 – Patrick 2012-03-20 23:52:18