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 - 无法接收消息的主要内容,如果未能解决你的问题,请参考以下文章
Pushwoosh / GCM - Android - 不接收消息