2012-11-18 18 views
4

我在Android上遇到GCM問題。它無法執行onRegistered()回調,或者在我的其中一個測試設備(Droid2)上返回一個好的regid,但它在另一臺設備(Galaxy Nexus)上運行良好。GCM Android:onRegistered()未被調用

我遵循基本示例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()回調的工作?什麼可能導致它在一臺設備上工作,但在另一臺設備上失敗?謝謝。

回答

5

如果它工作在某些設備上,但不是別人,然後它與下列之一做:

  • 前的Android 4.0.4的設備需要一個有效的谷歌帳戶的工作。
  • GCM僅適用於Play商店應用和API 8以上的設備。
  • 您的清單格式不正確 - 請使用Lint檢查!
  • 設備/應用程序已經註冊,Play實現可能不會再次返回。首先嚐試GCMRegistrar.unregister(this);

希望有幫助!

+0

謝謝@ Chris.Jenkins。它不工作的設備運行Android 2.3.4(API級別10)。它安裝了Play商店以及有效的Goggle帳戶。但是,它具有與其他工作設備相同的Google ID。這可能會造成問題嗎? – gcl1

+0

註冊註冊ID是設備/應用程序特定的。 Humm,如果它不在FC上的話。那很奇怪,只能假定GCM不適用於該設備上的任何東西?同步打開了嗎? –

+0

也注意到GCM在過去的某個時間點在部分舊設備(Droid2)上部分工作。那時,像現在一樣,onRegistered()調用從不返回,...但是調用GCMRegistrar.register()確實生成了一個很好的regId,我可以在該應用程序中使用它。我不確定發生了什麼變化,但現在GCMRegistrar.register()和onRegistered()回調都不起作用。 – gcl1

0

我有同樣的問題。如果您使用的是AngularJS + IonicFramework,則不需要執行此操作:

使用onDeviceReady函數創建工廠後,創建onNotificationGCM函數。事情是這樣的:

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

}); 

function onNotificationGCM(e) { 
} 

我在我的工廠裏創造onNotificationGCM。這解決了我的問題。