Android - 无法接收C2DM注册意图

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

这是意图(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服务器的服务,该服务应该会发送一个包含我的注册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");
    }
}

组件名称信息如下:
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的回复。

我的接收器(名为C2dmReceiver)- 这只是一个打字错误吗?应该是C2DMReceiver(有大写字母)。我假设这是一个打字错误,但还是想确认一下。 - Squonk
实际上,那只是一个打字错误。感谢您指出来。 - ariets
1
好的,我只是想确认一下。我能看到你没有展示的唯一一件事情就是像这样的一个条目... <permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />。你在 AndroidManifest.xml 中设置了吗? - Squonk
就是这样了。谢谢。如果您想回答它,我会将其标记为正确。 - ariets
很高兴能够帮到你。我已经添加了一个答案,并稍微扩展了一下,以便将来对其他人有所帮助。 - Squonk
2个回答

2
从Google文档中关于C2DM的创建清单,清单需要一个<permission>条目来补充C2D_MESSAGE<uses-permission>条目。
类似这样...
<permission android:name="com.companyname.parade.permission.C2D_MESSAGE" android:protectionLevel="signature" />

0

这个教程对我非常有帮助: http://www.vogella.com/articles/AndroidCloudToDeviceMessaging/article.html

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

我建议检查一下你的清单是否正确引用了接收器类 - 可以尝试使用完全限定的类引用。我曾经遇到过一个问题,就是在我的项目结构中移动接收器类后,所有消息都停止了。

我还建议检查一下C2DM帐户是否设置正确,并且与正确的包名称匹配。

我还建议在另一台设备上尝试一下,因为根据我的经验,有些Android设备会掉线,一段时间内无法接收消息。有时候将设备切换到飞行模式再切回来可以解决问题,但我发现在多台设备上进行测试是必不可少的,以排除特定设备的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接