GCM Android:未调用onRegistered()

时间:2012-11-18 19:42:34

标签: android notifications google-cloud-messaging

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

我正在关注基本示例here。来电者看起来像这样:

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()回调不起作用?什么可能导致它在一个设备上工作,但在另一个设备上失败?感谢。

2 个答案:

答案 0 :(得分:5)

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

  • 在Android 4.0.4之前,该设备需要有效的Google帐户才能运行。
  • GCM仅适用于具有Play商店应用和API 8的设备。
  • 您的清单格式错误 - 请使用Lint进行检查!
  • 设备/应用已经注册,Play实施可能不会再次返回..请先尝试GCMRegistrar.unregister(this);

希望有所帮助!

答案 1 :(得分:0)

我遇到了同样的问题。如果您使用的是AngularJS + IonicFramework,则不必执行此操作:

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

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

});

function onNotificationGCM(e) {
}

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