除非删除 SEND 权限,否则不会收到 GCM 消息

Posted

技术标签:

【中文标题】除非删除 SEND 权限,否则不会收到 GCM 消息【英文标题】:GCM messages are not received unless SEND permission is removed 【发布时间】:2014-01-16 13:56:49 【问题描述】:

为了正确实施 GCM,应按照the official docs 为接收者指定com.google.android.c2dm.SEND 权限:

接收者应该需要 com.google.android.c2dm.SEND 权限,这样只有 GCM 框架才能向它发送消息。

但是,当我添加该权限时,收到消息时会收到此错误。

W/GTalkService(25224):[DataMsgMgr] 广播意图回调:result=CANCELLED forIntent act=com.google.android.c2dm.intent.RECEIVE cat=[com.XXX.XXX](有附加功能)

随后出现此错误:

W/ActivityManager(283): Permission Denial: 从 com.google 广播 Intent act=com.google.android.c2dm.intent.RECEIVE cat=[com.XXX.XXX] flg=0x10 (has extras) 由于接收方 com.XXX.XXX/com.XXX.XXX.GcmBroadcastReceiver,.android.syncadapters.contacts 需要 com.google.android.c2dm.SEND

如果我只删除该权限而不更改任何其他内容,则接收方可以正常工作并且我可以处理消息。

这是 AndroidManifest.xml 中的接收器定义

<receiver
        android:name="com.XXX.XXXX.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="com.XXX.XXX" />
        </intent-filter>
    </receiver>

我在测试期间使用调试证书,以防万一。

【问题讨论】:

【参考方案1】:

试试com.google.android.c2dm.permission.SEND而不是com.google.android.c2dm.SEND,如:

<receiver
  android:name="GCMBroadcastReceiverCompat"
  android:permission="com.google.android.c2dm.permission.SEND">
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
    <category android:name="com.commonsware.android.gcm.client"/>
  </intent-filter>
</receiver>

(来自this sample app)

【讨论】:

谢谢。那解决了它。官方文档中的示例清单实际上是正确的。前面的文字解释虽然使用了不正确的 com.google.android.c2dm.permission.SEND。【参考方案2】:

试试这个:

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

<receiver
        android:name="com.robustastudio.mateegy.GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>

            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="com.robustastudio.mateegy" />
        </intent-filter>
    </receiver>

【讨论】:

以上是关于除非删除 SEND 权限,否则不会收到 GCM 消息的主要内容,如果未能解决你的问题,请参考以下文章

除非在 [重复] 之前打印条件,否则不会调用 if 语句

除非与mouselistener一起使用,否则JLabel不会显示

除非选择了项目,否则Visual Studio不会保存构建更改

除非已登录Google帐户,否则不会显示嵌入式Google日历

GCM:如果应用程序不可见,则不会收到 IntentService.sentBroadcast 的消息

即使所有消息都从服务器成功,某些设备也不会收到 GCM 推送