特定设备未收到 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) 未收到远程通知

访问未配置 Android Google API 密钥

当 Google Play 控制台设备目录中未显示特定设备品牌/型号时,如何排除它?

Google Cloud Builder-构建触发器失败,并显示“未找到请求的资源”

从 Google Cloud Pub/Sub 而不是 base64 获取未编码的数据

Matrix XMPP 在使用 FCM 发送到特定设备时收到“未授权”标签