【问题标题】:C2DM: How to use C2D_MESSAGE permission?C2DM:如何使用 C2D_MESSAGE 权限?
【发布时间】:2011-02-25 18:22:40
【问题描述】:

我即将为我的应用程序实现 C2DM,但我发现 documentation 对于如何编写清单有点混乱。

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

<!-- 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);

接收到registrationIntent的Service如何知道要检查什么权限?据我了解(如果我在这里错了,请纠正我),在声明权限时,我可以在我的命名空间中选择任何权限名称,例如com.example.myapp.permission.WHATEVER.

还是 C2D_MESSAGE 是我必须使用的一些魔法常数?


此外,文档说我必须为com.google.android.c2dm.intent.C2D_MESSAGEcom.google.android.c2dm.intent.REGISTRATION Intents 实现接收器。但在代码示例中,接收者的过滤器只包含.intent.RECEIVE.intent.REGISTRATION Intent。 C2D_MESSAGE去哪儿了,和我上面的问题有关系吗?

我希望这不是很明显,但我就是不明白...请帮忙。

【问题讨论】:

    标签: android android-c2dm


    【解决方案1】:

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

    “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
    

    【讨论】:

    • 如果我不声明并要求 C2D_MESSAGE 权限会怎样?那么我将无法接收任何 c2dm 广播吗?这意味着我的第一个代码块中的注释实际上应该是“确保我们可以接收 c2dm 广播完全
    • 从文档来看,如果你没有声明那个权限,那么C2DM中寻找能处理intent(并且有权限)的BroadcastReceivers的部分将找不到任何BroadcastReceivers去尝试,所以广播不会去任何地方。我没有尝试过,但尝试起来真的很简单。首先,我会按照文档示例来确保您一切正常。
    • 谢谢,我再次阅读了 BroadcastReceiver 的文档,现在明白了。我第一次阅读时没有注意到的是,在触发广播 Intent 时,可以明确要求许可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-22
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多