3

デバイスを C2DM に登録しようとしていますが、重大な問題が発生しています。私はいくつかのチュートリアルに従いましたが、それらはすべて非常に似ています。この問題は、C2DM サーバーに送信される登録インテントに関係していると思います。誰にも提案はありますか。関連するコードは次のとおりです。

マニフェスト:アクセス許可(アプリケーション タグの外側):

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

これはインテント登録です(私のアプリケーションタグ内):

<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>

以下は、自分のデバイスを C2DM サーバーに登録するために呼び出すものです (C2DM サーバーに接続するサービスを開始します。このサービスは、私の登録 ID を含む登録インテントを送り返すことになっています)。C2DMessagingというファイルにあります。

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");
    }
}

ComponentName 情報は次のとおりです。

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

logcat の出力はありません。私のレシーバー(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 に感謝します。

4

2 に答える 2

2

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

このようなもの...

<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />
于 2012-04-17T18:54:27.287 に答える
0

このチュートリアルは、私をスピードアップするのに役立ちました: http ://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

なぜ2つのインテントフィルターがあるのか​​わかりません。必要なのは1つだけです-com.google.android.c2dm.intent.REGISTRATION(マニフェストの完全な例については上記のチュートリアルを参照してください)

マニフェストがレシーバークラスを正しく参照していることを確認します。おそらく、クラスへの完全修飾参照を試してください。プロジェクト構造でレシーバークラスを移動し、すべてのメッセージが停止するという問題が発生しました。

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

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

于 2012-04-17T16:10:52.390 に答える