2012-04-17 5 views
3

私のデバイスをC2DMに登録しようとしましたが、大きな問題があります。私はいくつかのチュートリアルに従ってきました。これらはすべて非常に似ています。私は問題がC2DMサーバーに送信する登録の意図と関係していると考えています。誰にも何か提案がありますか?Android - C2DM Registration Intentを受信できません

マニフェスト:(私のアプリケーションタグ外)権限

<receiver 
    android:name=".C2DMReceiver" 
    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.companyname.parade" /> 
    </intent-filter> 
    <!-- Receive the registration id --> 
    <intent-filter> 
     <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
     <category android:name="com.companyname.parade" /> 
    </intent-filter> 
</receiver> 

<!-- Used for C2DM --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="com.companyname.parade.permission.C2D_MESSAGE" /> 

これは意図登録(私のアプリケーションタグ内)であり、以下に関連するコードであります以下は私のデバイスをC2DMサーバーに登録するために呼び出すものです(登録インテントを自分のregistartionIDとともに返信するC2DMサーバーに接続するサービスを開始します)。 C2DMessagingと呼ばれるファイルにあります。

com.google.android.gsf/com.google.android.gsf.gtalkservice.PushMessagingRegistrar 

にはlogcat出力がありません:

public static void register(Context context) { 
    Intent registrationIntent = new Intent(REQUEST_REGISTRATION_INTENT); 
    registrationIntent.putExtra(EXTRA_APPLICATION_PENDING_INTENT, 
      PendingIntent.getBroadcast(context, 0, new Intent(), 0)); 
    registrationIntent.putExtra(EXTRA_SENDER, SENDER_ID); 
    ComponentName name = context.startService(registrationIntent); 
    if(name == null){ 
     // FAIL! 
     Log.d(TAG, "FAIL"); 
    }else{ 
     // SUCCESS 
     Log.d(TAG, "Success"); 
    } 
} 

コンポーネント名の情報は以下の通りです。 (C2DMReceiverという名前の)私の受信機は以下の通りです:

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    if (C2DMessaging.INTENT_REGISTRATION_CALLBACK.equals(action)) { 
     // Registration Intent 
     Log.w(TAG, "Registration Receiver called"); 
     handleRegistration(context, intent); 
    } else if (action.equals(C2DMessaging.INTENT_RECEIVED_MESSAGE_CALLBACK)) { 
     Log.w(TAG, "Message Receiver called"); 
     handleMessage(context, intent); 
    } else if (action.equals(C2DMessaging.INTENT_C2DM_RETRY)) { 
     C2DMessaging.register(context); 
    } 
} 

これはまったく呼び出されません。

を編集してください:この全部は私の愚かな誤りでした。私は読んでいるチュートリアルで何とかして一歩忘れてしまった。私はこれを私の許可に追加する必要があります:

<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

応答のためにMisterSquonkに感謝します。

+0

"受信者(C2dmReceiverという名前)" - これは単に入力ミスですか?それはC2DMReceiver(大文字付き)でなければなりません。私はそれが誤字だと思うが、私がチェックすると思った。 – Squonk

+0

それは実際には、ちょうどタイプミスでした。それを指摘してくれてありがとう。 – ariets

+1

OK、ちょうど私がチェックすると思った。あなたが表示されていない唯一のものは、このようなエントリを持っているということです... ' ' 。 'AndroidManifest.xml'にその設定がありますか? – Squonk

答えて

2

Creating the ManifestのC2DMのGoogleドキュメントから、C2D_MESSAGE<uses-permission>エントリを補うためにマニフェストには<permission>のエントリが必要です。

このようなもの...

<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
0

このチュートリアルでは、速度に私を得ることに私の仕事: http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

を使用すると、2つのインテントフィルタを持っている理由私はよく分かりません。私はcom.google.android.c2dm.intent.REGISTRATIONの1つしか必要ありません(完全なサンプルマニフェストについては上のチュートリアルを参照してください)

マニフェストがレシーバクラスを正しく参照していることを確認します。クラスに。私はプロジェクトの構造内でレシーバクラスを移動し、すべてのメッセージが停止した時点で問題が発生しました。

また、C2DMアカウントが正しいパッケージ名で設定されていることを確認したいと思います。

私の経験では、いくつかのAndroidデバイスがC2DMから脱落し、一定期間メッセージを受信しないので、別のデバイスでも試してみます。私は飛行機モードにフリックすることがあり、それを並べ替えることがあると思いますが、特定のデバイスの問題を排除するために不可欠ないくつかのデバイスのテストが見つかりました。

関連する問題