特定设备未收到 Google Cloud Messaging 通知
Posted
技术标签:
【中文标题】特定设备未收到 Google Cloud Messaging 通知【英文标题】:Specific device not receiving Google Cloud Messaging notifications 【发布时间】:2013-10-11 15:09:29 【问题描述】:我有一个应用程序,我在其中实现Google Cloud Messaging
通知,但在特定设备中消息没有到达。此设备具有使用 GCM 的最低要求(android 版本 2.2,已安装 Play 商店并已登录 Google 帐户)。在日志中,我看到该设备正在接收注册 ID 并发送到我已注册设备列表的后台。
我的问题是:我是否需要进行额外的配置才能让设备接收这些通知?
这是清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="br.com.testegcm"
android:versionCode="1"
android:versionName="1" >
<uses-sdk
android:minSdkVersion="7"
android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
<application
android:name="TesteGCM"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver
android:name="br.com.testegcm.GcmBroadcastReceiver"
android:exported="true"
android:enabled="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="br.com.testegcm" />
</intent-filter>
</receiver>
<service android:name="br.com.testegcm.GcmIntentService" />
<activity
android:name="br.com.testegcm.Home"
android:screenOrientation="portrait"
android:label="@string/app_name"
android:theme="@style/notitle" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
【问题讨论】:
请包含您的代码(清单、广播接收器等...)。清单中的某些错误可能会导致仅在较旧的 Android 版本上无法接收消息。 @Eran 我包含了清单 【参考方案1】:改变这个:
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />
到:
<permission android:name="br.com.testegcm.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="br.com.testegcm.permission.C2D_MESSAGE" />
【讨论】:
【参考方案2】:添加相同的问题,我最终意识到我需要在清单中更改广播接收器包名称从 com.example.gcm 到我的包名称:
<!-- Push notifcations-->
<receiver
android:name=".BroadcastRecivers.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="com.example.gcm"/>
</intent-filter>
</receiver>
到
<!-- Push notifcations-->
<receiver
android:name=".BroadcastRecivers.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE"/>
<category android:name="MY PACKAGE NAME"/>
</intent-filter>
</receiver>
【讨论】:
谢谢!有趣的是,简单而明显的修复。在设备> = API 19 w/顶部为我工作,但在我进行底部更改之前无法使用API 15。显然后者更为严格。我懒惰地复制了示例代码,却没有意识到我使用的是示例 pkg 名称。【参考方案3】:不需要除了Android 2.2版本,安装Play Store应用并登录谷歌账号不需要其他配置,现在只剩下两种情况了
1) Either there is some ambiguity in your code.
2) or may be it is a device specific issue.
【讨论】:
【参考方案4】:我遇到了同样的问题。我的代码可以在 nexus4(Kitkat) 上运行,但无法从 appln 服务器(通过 gcm 服务器)向我发送通知。对于低于 4.0.4 的版本,您应该确保在您的设备上设置您的 google 帐户,以便 gcm 工作。我的手机上有 Google 帐户,但我犯的错误是我的 Galaxy ace 中的帐户和同步设置为“关闭”。当我打开它并运行我的代码时,我收到了通知。
【讨论】:
在我的情况下,同步是开启的,所以问题不一样。【参考方案5】:请检查以下解决方案。如果仍然不起作用,请告诉我。 在两个不同的 Intent 过滤器中添加 RECEIVE 和 REGISTRATION Intent
<receiver
android:name=“<.GCM BroadcastReceiver Name>“ // Name of your BroadcastReceiver, define in code.
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name=“<Package Name>" />
</intent-filter>
<intent-filter>
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name=“<Package Name>" />
</intent-filter>
</receiver>
<service android:name=“<.GCM IntentService Name>" /> // Name of your IntentService, define in code.
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
如上所示在两个不同的 Intent 过滤器中添加 RECEIVE 和 REGISTRATION Intent,否则它不适用于某些设备(例如 HTC)。
【讨论】:
以上是关于特定设备未收到 Google Cloud Messaging 通知的主要内容,如果未能解决你的问题,请参考以下文章
ios Google Cloud Messaging (GCM) 未收到远程通知
当 Google Play 控制台设备目录中未显示特定设备品牌/型号时,如何排除它?
Google Cloud Builder-构建触发器失败,并显示“未找到请求的资源”