0

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")。

表示される警告は次のとおりです。

パッケージ es.mypackage.es に com.google.android.c2dm.permission.SEND 権限を付与していません (protectionLevel=3 flags=0xbe46)

[DataMsgMdr] ブロードキャスト インテント コールバック: result= CANCELED for Intent {act=com.google.c2dm.intent.RECEIVE cat= es.mypackage.es (エクストラあり)

受信者パッケージが見つかりません。アプリケーション es.mypackage.es の登録を解除します。送信者 sender@gm...

ありがとうございました。よろしくお願いします。

4

2 に答える 2

2

アカウントが登録されていないためです。よろしいですか、送信者アドレスに正しいC2DM 登録済みアカウントを入力しました。Package Name登録時に入力したものと同じものを使用してくださいC2DM...

于 2012-05-15T04:00:09.823 に答える
1

私が理解できないのは、マニフェストでブロードキャスト レシーバーを定義しない理由です。アクティビティで定義すると、C2DM はアプリケーション (特定) のアクティビティがロードされたときにのみ機能することを意味します (コードはWhere to register a BroadcastReceiver (Activity lifecycle fun) のようなものだと思います)。

ただし、その場合、C2DM は必要ありません。サーバーへのアクティブな接続を開くことができます。C2DM の全体的な考え方は、アプリケーションがロードされていないときでもアプリケーションをトリガーできるということです。ガイドについては、https://stackoverflow.com/a/8943715/734687を参照してください。

于 2012-05-15T10:07:04.207 に答える