6

我正在尝试测试 C2DM 框架。几天前我收到了确认电子邮件,然后尝试创建一个可以注册的客户端。为此,我按照本教程中描述的步骤创建了一个简单的客户端:http ://code.google.com/intl/es-419/android/c2dm/index.html 。

Android 清单文件包含以下代码:

<permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" />

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

<uses-permission android:name="android.permission.INTERNET"/>

<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">

<intent-filter>
   <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
   <category android:name="com.bilthon.ufrj" />
</intent-filter>

<intent-filter>
   <action android:name="com.google.android.c2dm.intent.RECEIVE" />
   <category android:name="com.bilthon.ufrj" />
</intent-filter>
</receiver>

然后,程序启动时启动的主要活动有以下代码:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender","mytestemail@gmail.com");
Log.d("WelcomeScreen","mytestemail@gmail.com");
startService(registrationIntent);

我还在运行我的客户端的 AVD 上注册了一个谷歌帐户,因为他们说这是必需的。但问题是我无法让广播接收器“唤醒”。我不知道有什么问题。通过分析日志,我可以看到注册意图已创建并且显然使用正确,但接收器代码从未执行过,可能有什么问题?

提前感谢尼尔森

4

4 回答 4

9

好吧..刚刚整理出来,问题出在接收者的声明上。接收者的标签应该放在应用程序标签内,就像这里演示的那样:http: //developer.android.com/guide/topics/manifest/manifest-intro.html

这是 C2DM 应用程序格式良好的清单示例。感谢 Mark Murphy 在 android-c2dm 组中发布链接。

并为这个愚蠢的错误感到抱歉。

尼尔森

于 2010-09-08T23:08:39.653 回答
3

在与它搏斗了一段时间后,我自己才开始使用它。

在清单中,您有一行

<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">

这意味着您需要一个名为 C2DMReceiver 的类,它扩展了 c2dm 包中的 C2DMBaseReceiver。为了实现这一点,我将 chrometophone-android 示例中的 c2dm 包和 C2DMReceiver.java 文件复制到我的项目中,并且能够按预期从 C2DM 服务器获取注册 ID。

于 2010-09-09T05:38:46.230 回答
2

我有同样的问题。我的解决方案是将清单中的所有权限移到应用程序标记上方。

于 2011-10-06T20:45:39.957 回答
1

您可以检查的事项:

1我注意到您正在声明 C2DM 权限,但不要像这样在您的应用程序中使用它:

<uses-permission android:name="com.bilthon.ufrj.permission.C2D_MESSAGE" />

2如果您查看 c2dm 库,您将看到帮助程序C2DMessagingregister方法通过额外调用来创建意图setPackage

registrationIntent.setPackage("com.google.android.gsf");
于 2010-09-06T15:54:19.800 回答