C2DM:如何使用C2D_MESSAGE权限?

36

我即将为我的应用程序实现C2DM,但是我发现文档在如何编写清单方面有点令人困惑。

清单的示例代码包含以下内容:

<!-- Only this application can receive the messages and registration result --> 
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />

解释如下:

applicationPackage + ".permission.C2D_MESSAGE" 防止其他应用程序注册并接收该应用程序的消息。

但是,这个到底是怎么工作的呢?据我理解,这声明了一个权限,然后为我的应用程序获取了该权限。但是,这个权限究竟在哪里执行?

给出的注册代码如下:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);
Service接收到registrationIntent后,如何知道要检查哪个权限?据我所知(如果我理解错误,请纠正),在声明权限时,我可以在我的命名空间中选择任何权限名称,例如com.example.myapp.permission.WHATEVER。
还是说C2D_MESSAGE是某种必须使用的神奇常量?
此外,文档说我必须为com.google.android.c2dm.intent.C2D_MESSAGE和com.google.android.c2dm.intent.REGISTRATION Intents实现接收器。但是在代码示例中,接收器的过滤器仅包含.intent.RECEIVE和.intent.REGISTRATION Intents。C2D_MESSAGE去了哪里,并且它是否与我上面提出的问题有关?
希望这不是一些显而易见的东西,但我就是不懂...请帮忙。
1个回答

24

他们在摘要中声称您需要的接收器似乎是文档中的错误,因为它与清单示例不匹配。

"用于 com.google.android.c2dm.intent.C2D_MESSAGE 和 com.google.android.c2dm.intent.REGISTRATION 的接收器."

我成功地使用了他们提供的示例清单条目,只需调整以匹配我的特定应用程序包名称即可。

当 Android 中的 C2DM 代码发送广播(或者说,查找要发送广播的潜在接收器时),它会查找:

查找 Intent 的广播接收器:com.google.android.c2dm.intent.REGISTRATION
并且该广播接收器具有权限:.permission.C2D_MESSAGE

Android C2DM 代码发送到您的应用程序的所有 C2DM 消息都将寻找该特定权限。它仅适用于您的应用程序,并且只需在该结构中(您的应用程序包+“ .permission.C2D_MESSAGE”)中即可。

至于注册请求如何获取要用于权限的包名称,这是在您首次使用“app”参数进行注册时处理的-来自文档的说明:

“ app 是应用程序的 ID,使用 PendingIntent 设置以允许注册服务提取应用程序信息。”

有疑问的那一行:

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate

2
如果我不声明和需要C2D_MESSAGE权限会发生什么?那我就无法接收任何c2dm广播了吗?这意味着我第一个代码块中的注释实际上应该是“确保我们可以完全接收c2dm广播”。 - user634618
1
从文档来看,如果您没有声明该权限,则寻找可以处理意图(并具有该权限)的BroadcastReceiver的C2DM部分将找不到任何BroadcastReceiver可尝试,因此广播将无法传递。我还没有尝试过,但是尝试非常简单。首先请按照文档示例确保您已经使一切正常。 - mbafford
1
谢谢,我再次阅读了 BroadcastReceiver 的文档,现在明白了。我第一次阅读时没有注意到的是,当触发广播意图时,可以显式要求权限。 - user634618

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