Android - 无法接收C2DM注册意图

时间:2012-04-17 15:47:11

标签: android android-c2dm

我正在尝试使用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" />

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

以下是我将设备注册到C2DM服务器的呼叫(它启动了与C2DM服务器联系的服务,该服务假设将寄存器Intent与我的registartionID一起发回)。它位于名为 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的回复。

2 个答案:

答案 0 :(得分:2)

Creating the Manifest的C2DM文档中,清单需要<permission>条目来补充<uses-permission>的{​​{1}}条目。

像这样......

C2D_MESSAGE

答案 1 :(得分:0)

本教程让我了解速度: http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

我不确定为什么你有两个意图过滤器。我只需要一个 - com.google.android.c2dm.intent.REGISTRATION(请参阅上面的教程以获取完整的示例清单)

我会检查你的清单是否正确引用了接收器类 - 或者尝试对该类进行完全限定的引用。我有一个问题,我在项目结构中移动了接收器类,所有消息都停止了。

我还会检查C2DM帐户是否设置正确,并使用正确的包名称。

我也会在另一台设备上试用它,因为根据我的经验,一些Android设备会脱离C2DM并且在一段时间内不会收到消息。我发现有时会轻弹到飞行模式然后将其排序,但我发现在几个设备上进行测试对于排除特定设备的问题至关重要。