4

我在 Android 上遇到 GCM 问题。它无法在onRegistered()我的一个测试设备(Droid2)上执行回调或返回一个好的 regId - 但它在另一台设备(Galaxy Nexus)上运行良好。

我在这里遵循基本示例。调用者看起来像这样:

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);

final String regId = GCMRegistrar.getRegistrationId(this);

if (regId.equals(""))
    GCMRegistrar.register(this, Constants.SENDER_ID);
else
    Log.v(TAG, "Already registered");

我的清单有这个:

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

<receiver
    android:name="com.google.android.gcm.GCMBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
        <category android:name="com.gcl.myapp" />
    </intent-filter>
</receiver>

为什么onRegistered()回调不起作用?什么可能导致它在一台设备上工作,但在另一台设备上失败?谢谢。

4

2 回答 2

5

如果它适用于某些设备但不适用于其他设备,那么它与以下之一有关:

  • 在 Android 4.0.4 之前,该设备需要有效的 google 帐户才能工作。
  • GCM 仅适用于具有 Play Store App 和 API 8 及更高版本的设备。
  • 您的清单格式错误 - 使用 Lint 检查!
  • 设备/应用程序已注册,Play 实现可能不会再次返回。请先尝试GCMRegistrar.unregister(this);

希望有帮助!

于 2012-11-18T19:48:09.517 回答
0

我有同样的问题。如果您使用的是 AngularJS + IonicFramework,则不必这样做:

使用 onDeviceReady 函数创建工厂后,创建 onNotificationGCM 函数。像这样的东西:

app.factory('PushProcessingService', function () {
..

});

function onNotificationGCM(e) {
}

我在工厂内创建 onNotificationGCM。这解决了我的问题。

于 2014-10-31T13:46:54.727 回答