Android GCM - 无法接收消息

Posted

技术标签:

【中文标题】Android GCM - 无法接收消息【英文标题】:Android GCM - Cannot receive Messages 【发布时间】:2016-08-09 11:44:22 【问题描述】:

androidManifest.xml:

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

    <!-- Receiver for GCM Messages-->
    <receiver
        android:name="com.google.android.gms.gcm.GcmReceiver"
        android:exported="true"
        android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
                <action android:name="com.google.android.c2dm.intent.GCM_RECEIVED_ACTION"/>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="de.comp.module.client" />
            </intent-filter>
    </receiver>

    <service
        android:name="de.comp.module.client.gcm.GCMBroadcastIntentService"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        </intent-filter>
    </service>

GCMBroadcastIntentService 类:

public class GCMBroadcastIntentService extends GcmListenerService 

    @Override
    public void onMessageReceived(String from, Bundle extras) 
         if (extras.containsKey("message")) 
    

永远不会调用 onMessageReceived() 方法。服务器工作正常,消息发送到谷歌 GCM 没有任何错误,但它们从未到达设备。我还使用存储在文件夹 /app 中的 google-services.json。在我的应用程序中,用户可以在新安装后登录。在这种情况下,请求一个新的 GCM 令牌并将其发送到服务器。所以它应该是正确的和最新的。

缺少什么?感谢您的帮助。

编辑:

public class GCMRegistrationIntentService extends IntentService 
    @Override
         protected void onHandleIntent(Intent intent) 

        try 

           // register server key to GCM
           GoogleCloudMessaging gcm =   GoogleCloudMessaging.getInstance(this);
           String regid = gcm.register(getString(R.string.gcm_defaultSenderId));

        // Request new token for this server key
        InstanceID instanceID = InstanceID.getInstance(this);
        String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

        // Subscribe to topic channels
        subscribeTopics(token);
    ...

【问题讨论】:

你把服务器密钥注册到Gcm了吗?? 【参考方案1】:

您必须在 Gcm 中注册发件人 ID:

 GoogleCloudMessaging gcm=null;

 try 

     if (gcm == null) 

         gcm = GoogleCloudMessaging.getInstance(getContext());

     

     String regid = gcm.register(SENDER_ID);


  catch (IOException ex) 

   msg = "Error :" + ex.getMessage();

 

请注意,SENDER_ID 是发送通知的服务器的 ID

【讨论】:

感谢您的回答。我会检查。我必须注册一次还是每次启动应用程序时都必须注册? 你必须注册一个,但如果每次启动应用都注册它,它也可以正常工作。 它不起作用。在 IntentService 中进行注册是否有问题?请参阅上面我更新的问题。 是的,在应用程序运行后运行的第一个活动中进行注册 谢谢。我今晚会检查。一个问题。要完全接收消息,我必须将 regId 从 gcm.register(SENDER_ID) 发送到服务器,对吗?无论如何,要获取消息,我都不需要来自 InstanceID.getInstance(this) 的令牌/InstanceId,对吗?【参考方案2】:

使用 FCM 代替 GCM。Check this official links. FCM is a new Version of GCM

【讨论】:

【参考方案3】:

尝试从头开始。

    确保 SENDER_ID 与控制台中的项目编号匹配。 确保你实现了注册 IntentService,设备注册成功并且你收到推送令牌(GCM 注册 id)。 确保将其传递给服务器。 不要忘记实现 InstanceIDListenerService。 将缺少的服务添加到清单。 一切从头做起,注意每一步https://developers.google.com/cloud-messaging/android/client

【讨论】:

【参考方案4】:

根据https://developers.google.com/cloud-messaging/android/client设置GCM客户端

如果你仍然没有接到 onMessageReceived() 的调用,你可以检查问题是否类似于GcmListenerService.onMessageReceived() not called

如果您使用已弃用的库 (GCMRegistrar.register),则 GCM 还需要 Google 帐户用于 4.0.4 之前的设备,.如果是,您需要在 AndroidManifest 中输入一个

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

参考GET_ACCOUNTS permission while using GCM - Why is this needed?

【讨论】:

以上是关于Android GCM - 无法接收消息的主要内容,如果未能解决你的问题,请参考以下文章

应用关闭时无法接收 GCM

Pushwoosh / GCM - Android - 不接收消息

在 Android 上的代理后面接收 FCM (GCM)

无法使用 GCM 在设备上接收消息

使用 Amazon SNS 在 Android GCM 中仅接收默认消息

无法使用 Node.js + XMPP 接收上游 GCM 消息