在Android中注册C2DM遇到问题

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上注册了一个谷歌账号,因为他们说这是必须的。但问题是我无法让广播接收器“唤醒”。我不知道可能出了什么问题。通过分析日志,我可以看到注册意图被创建并且似乎被正确使用,但是接收器代码永远不会被执行,这可能出了什么问题呢?
提前感谢 Nelson
4个回答

9

好的..刚刚整理了一下,问题出在接收者声明上。接收者标签应该放在应用程序标签里,就像这个网页中所示:http://developer.android.com/guide/topics/manifest/manifest-intro.html

以下是C2DM应用程序清单的格式良好的示例,感谢Mark Murphy在android-c2dm组张贴此链接。

对于这个愚蠢的错误我们表示抱歉。

Nelson


3
我刚刚在与它的斗争中终于使它工作了。
在清单文件中,你有这一行:
<receiver android:name=".C2DMReceiver" android:permission="com.google.android.c2dm.permission.SEND">

这意味着您需要一个名为C2DMReceiver的类,它继承自c2dm包中的C2DMBaseReceiver。为了实现这一点,我将chrometophone-android示例中的c2dm包和C2DMReceiver.java文件都复制到我的项目中,并成功地从C2DM服务器获取了注册ID。


2

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


1

你可以检查以下几点:

1 我注意到你在声明C2DM权限,但是在应用程序中并没有像这样使用它:

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

2 如果你看一下c2dm库,你会发现helper C2DMessagingregister方法创建了一个带有额外调用setPackage的意图。

registrationIntent.setPackage("com.google.android.gsf");

抱歉,我在这里复制文本时可能犯了一个错误,因为我刚刚检查了我的清单文件,它确实有像你说缺失的那行。至于你回答的第二部分,我必须说我甚至还没有尝试发送消息。我只是试图注册应用程序,这是通过意图完成的,就我所理解的。 - Bilthon
我不太清楚它的含义,但我注意到在logcat中出现了这一行:09-06 20:08:04.063: ERROR/C2DMRegistrar(169): [C2DMReg] handleRequest caught java.io.IOException: SSL shutdown failed: I/O error during system call, Broken pipe。 - Bilthon
嗯,有趣。我在我的帖子中添加了另一件你可以尝试的事情。 - Josef Pfleger
1
没有任何反应。我现在得到了这个错误:09-08 22:06:47.188: ERROR/C2DMRegistrar(177): [C2DMReg] handleRequest caught java.net.UnknownHostException: android.clients.google.com - Bilthon
1
啊,那看起来像是DNS或网络问题。您能否在该设备上解析其他主机(例如google.com)? - Josef Pfleger
嘿@Bilthon,你是如何解决你在这里提到的java.net.unknownHostException的问题的?我卡在这一点上了。 - Rakib

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