我成功测试了我的GCM代码。
但完全相同的代码,我无法获得GCM推送并得到:
GCM错误:未注册。
答案 0 :(得分:52)
GCM响应Not Registered
表示在“如果是NotRegistered
之后,您应该从服务器数据库中删除注册ID,因为该应用程序是从设备卸载的,或者它没有配置广播接收器收到com.google.android.c2dm.intent.RECEIVE意图。“来自documentation。检查从设备上卸载应用程序或在AndroidManifest中描述错误的广播接收器时出现此错误的情况。您可以使用my test GCM server测试GCM功能。希望,这对你有帮助。
答案 1 :(得分:18)
如果您正在使用设备进行测试,则需要在获取令牌并重新测试之前删除InstanceID,因为一旦您覆盖了APK,它就会取消注册InstanceId,并且您会收到NotRegistered错误。因此,在您的RegisterIntentService类中,在onHandleIntent函数中执行以下操作:
InstanceID instanceID = InstanceID.getInstance(this);
try
{
instanceID.deleteInstanceID();
} catch(IOException e)
{
e.printStackTrace();
}
instanceID = InstanceID.getInstance(this);
答案 2 :(得分:9)
当GCM认为设备无法处理该消息时,会发生Not Registered
。如果应用程序被卸载或配置错误以处理消息,则会发生这种情况:
基于@Samik和@ O'Rilla的答案,我建议采取以下步骤:
<receiver>
中的<sender>
节点中已定义<application>
和AndroidManifest.xml
。<category android:name="COM.COMPANY.YOURAPP" />
<receiver>
答案 3 :(得分:5)
如果你真的认为你的代码是正确的并且仍然出现错误
{"error": "NotRegistered"}
尝试从手机手动取消安装应用程序并再次运行(您的设备将获得新的注册ID)。
至少在我的情况下问题已经解决了!
答案 4 :(得分:2)
当我在清单文件中的应用程序之外使用gcm接收器时出现此错误。将接收器移动到应用程序范围内,一切正常。一个非常快乐的小兔子。
<application>
...
<receiver>
...
</receiver>
...
</application>
答案 5 :(得分:2)
我使用旧的已弃用的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)
希望这有助于某人,因为我在此失去了几天! &GT;&LT;
答案 6 :(得分:1)
运行Android 4.0.4或更低版本的设备需要使用Google帐户。 http://developer.android.com/google/gcm/gcm.html
您还应该在清单文件中添加<uses-permission android:name="android.permission.GET_ACCOUNTS" />
。
答案 7 :(得分:0)
这意味着您只是提供错误的注册ID。 因此,首先运行您的移动应用程序,您的注册ID将作为令牌。 将此令牌作为注册ID放入您的应用服务器代码中。 对于App ID,您可以从Google开发人员控制台,项目和凭据中获取服务器ID。 对于发件人ID,请设置您可以从项目中获取的项目ID,以及开发人员控制台中的设置。