2014-11-03 162 views
35

我成功地測試了我的GCM代碼。GCM'錯誤:未註冊'

但完全相同的代碼,我不能讓GCM推得:

GCM錯誤:未註冊。

+3

幾乎不可能幫助你解釋不足。 – 2015-07-22 20:10:04

+1

@ T-D我很抱歉...我已經修復了這個問題,謝謝你的誠意! – LKM 2015-07-25 12:08:07

回答

46

GCM響應Not Registered意味着「如果是NotRegistered,您應該從服務器數據庫中刪除註冊ID,因爲應用程序是從設備上卸載的,或者它沒有配置接收com.google.android的廣播接收器。 c2dm.intent.RECEIVE意圖「。從documentation。檢查您遇到此錯誤的情況,從設備上卸載應用或在AndroidManifest中描述不正確的廣播接收器。您可以使用my test GCM server來測試您的GCM功能。希望,這可以幫助你。

+0

你能告訴我如何知道哪些id在服務器端未註冊,以便我可以從我的數據庫中刪除它們。 – 2015-09-10 19:29:42

+0

@DB當然,只有一種方法可以知道何時需要從服務器上的數據庫中刪除**註冊ID **。從GCM服務器獲取「NotRegistered」錯誤意味着您嘗試使用的registration_id無效,應該刪除。此外,您的服務器應該準備好處理來自GCM的** cannonical_id **響應。我解釋了** cannonical_id **的含義是什麼http://stackoverflow.com/questions/26826869/regarding-canonical-ids-in-gcm-google-cloud-messaging/26827470#26827470 – Samik 2015-09-10 19:35:17

+0

@DB你也可以診斷你的** registration_id **通過我的測試推送服務器http://1-dot-sigma-freedom-752.appspot.com/gcmpusher.jsp – Samik 2015-09-10 19:43:23

1

Google帳戶是運行Android 4.0.4或更低版本的設備上的要求。 http://developer.android.com/google/gcm/gcm.html

您還應該在您的清單文件中添加<uses-permission android:name="android.permission.GET_ACCOUNTS" />

+0

我已經有... – LKM 2014-11-03 18:12:36

2

當我在清單文件中的應用程序之外擁有gcm接收器時,發生此錯誤。將接收器移入應用程序範圍,並且一切正常。現在是一個非常快樂的兔子。

<application> 
... 
<receiver> 
... 
</receiver> 
... 
</application> 
1

我使用GCM舊的過時的代碼:

if (gcm == null) { 
       gcm = GoogleCloudMessaging.getInstance(this); 
      } 
      String regId = gcm.register(SENDER_ID); 
      msg = "Device registered, registration ID=" + regId; 

,並嘗試切換到新的途徑時:

InstanceID instanceID = InstanceID.getInstance(this); 
      String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), 
        GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 

我得到了同樣的錯誤,這是讓我堅持了兩天。

在嘗試了本書中的所有內容之後,修正了在開發者控制檯中禁用GCM,重新啓用它,然後轉到:https://developers.google.com/mobile/add爲我的Android應用程序生成新的google-services.json文件。

另請注意,RegistrationIntentService必須位於您的包裝的根部,否則不起作用! (請參閱此示例以適用於Android的gcm實施:https://github.com/google/gcm

希望這可以幫助某人,因爲我在此失去了日子! > <

17

如果您正在使用設備進行測試,您需要在獲取令牌和重新測試之前刪除InstanceID,因爲一旦覆蓋APK,它將取消註冊該InstanceId並獲得該NotRegistered錯誤。因此,在您RegisterIntentService類,在onHandleIntent功能做到以下幾點:

InstanceID instanceID = InstanceID.getInstance(this); 
try 
{ 
    instanceID.deleteInstanceID(); 
} catch(IOException e) 
{ 
    e.printStackTrace(); 
} 
instanceID = InstanceID.getInstance(this); 
+0

您是否只在調試版本上執行此操作? – Jeremy 2016-07-14 15:44:09

+0

只是在調試模式下 – Rhodesie 2016-07-19 02:12:07

+0

第一個副本被主持人刪除的原因在下面的註釋中可以看到。轉載請註明:「請不要在多個問題上發佈相同的答案,發佈一個好的答案,然後投票/選舉標記以將其他問題作爲重複進行關閉。如果問題不重複,請調整問題的答案。 – halfer 2016-12-18 21:47:58

3

如果你真的覺得你的代碼是正確的,仍然得到錯誤

{"error": "NotRegistered"} 

嘗試未安裝的應用程序從手機和手動運行它再次(您的設備將獲得新的註冊ID)。

至少在我的情況下,問題解決了!

+0

在我的情況下,問題也解決了!我嘗試刪除InstanceID並嘗試再次發送請求。但我只卸載應用程序時成功了(並且我沒有像以前一樣嘗試刪除實例ID) – 2017-01-30 23:38:49

8

當GCM認爲設備無法處理該消息時,會出現Not Registered。如果發生這種情況的應用被卸載或配置不當處理消息:基於@Samik和@ O'Rilla答案我建議以下步驟

enter image description here

  1. 卸載當前安裝的Android設備
  2. 確保您有<receiver><sender><application>節點AndroidManifest.xml中定義。
  3. 請確保您有正確的<category android:name="COM.COMPANY.YOURAPP" /><receiver>
  4. 確保接收器的實現是正確的
+0

步驟2修復了我的問題 - 這是一個愚蠢的疏忽,但是您的回答是在嘗試幾天後節省時間找到根本原因。謝謝@Roozbeh – 2017-07-14 18:37:16

0

這意味着只需您都給人一種錯誤的註冊ID。 因此,首先運行您的移動應用程序,您的註冊ID將作爲標記。 將此令牌作爲註冊ID加入您的應用服務器代碼。 對於App ID,提供服務器ID,您可以從Google開發者控制檯,項目和憑據中獲取該ID。 對於發件人ID,請設置您的項目ID,該項目ID可能來自項目,開發者控制檯中的設置。