C2DM自动取消注册

时间:2012-05-14 17:12:07

标签: android broadcastreceiver android-c2dm

我有一个使用C2DM的Android应用程序。我在主要活动中定义接收者(不在清单中)。我有这样的事情:

 c2dmReceiver = new BroadcastReceiver() {
 @Override
 public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) {
  String registrationId = intent.getStringExtra("registration_id");
  String error = intent.getStringExtra("error");
  String unregistered = intent.getStringExtra("unregistered");
  System.out.println("receiver registration: " + registrationId);
  System.out.println("unregister aplicacion: " + unregistered);

  if (registrationId != null){
        saveConfig("key", registrationId);
    postC2dm(registrationId);
      }
}
else 
   if (action.equals("com.google.android.c2dm.intent.RECEIVE")){
       final String payload = intent.getStringExtra("payload");
       System.out.println("Package : " + intent.getPackage());
       }
   }
 };
IntentFilter filtroReceiver = new     IntentFilter("com.google.android.c2dm.intent.REGISTRATION");
filtroReceiver.addAction("com.google.android.c2dm.intent.RECEIVE");
filtroReceiver.addCategory("es.unizar.c2dm");
registerReceiver(c2dmReceiver,filtroReceiver,"com.google.android.c2dm.permission.SEND",null);

在清单文件中:     

    <uses-permission android:name="mypackage.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="com.google.android.c2dm.permission.SEND" />

我的问题是:当我通过意图“com.google.c2dm.intent.RECEIVE”收到“有效负载”时,我收到了正确的数据“有效负载”但我收到了registrationId = null而我的类别未注册(在动作“com.google.c2dm.intent.registration”)。

出现的警告是:

未授予com.google.android.c2dm.permission.SEND权限以包装es.mypackage.es(protectionLevel = 3 flags = 0xbe46)

[DataMsgMdr]广播意图回调:结果=取消了Intent {act = com.google.c2dm.intent.RECEIVE cat = es.mypackage.es(有额外内容)

未找到Receiver包,取消注册应用程序es.mypackage.es sender sender @ gm ...

谢谢。 最好的问候。

2 个答案:

答案 0 :(得分:2)

这是因为您的帐户未注册。你确定吗,你进入了正确的C2DM 您的发件人地址中已注册的帐户。使用与注册到Package Name时输入的相同C2DM ...

答案 1 :(得分:1)

我不明白为什么你没有在清单中定义广播接收器。在活动中定义它意味着C2DM仅在您的活动的应用程序(特定)被加载时才起作用(我假设您的代码类似于Where to register a BroadcastReceiver (Activity lifecycle fun))。

但在这种情况下,您不需要C2DM,您可以打开与服务器的活动连接。 C2DM的整体思想是即使没有加载也能触发你的应用程序。有关指南,请参阅https://stackoverflow.com/a/8943715/734687

相关问题