【问题标题】:Android GCM - Cannot receive MessagesAndroid GCM - 无法接收消息
【发布时间】: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了吗??

标签: android google-cloud-messaging


【解决方案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】:

【讨论】:

    【解决方案3】:

    尝试从头开始。

    1. 确保 SENDER_ID 与控制台中的项目编号匹配。
    2. 确保你实现了注册 IntentService,设备注册成功并且你收到推送令牌(GCM 注册 id)。
    3. 确保将其传递给服务器。
    4. 不要忘记实现 InstanceIDListenerService。
    5. 将缺少的服务添加到清单。
    6. 一切从头做起,注意每一步
      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?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        相关资源
        最近更新 更多