Android GCM:GCMRegistrar提供了空的注册ID

4

我已经按照http://developer.android.com/guide/google/gcm/gs.html#server-app的指导实现了我的应用程序中的GCM

                    GCMRegistrar.checkDevice(this);
        GCMRegistrar.checkManifest(this);
        if (GCMRegistrar.isRegistered(this)) {
            Log.d(TAG, GCMRegistrar.getRegistrationId(this));
        }
        final String regId = GCMRegistrar.getRegistrationId(this);

        if (regId.equals("")) {
            GCMRegistrar.register(this, sender_id);
            Log.d(TAG, "Registration id :  "+GCMRegistrar.getRegistrationId(this));
        }
            else {
            Log.d("info", "already registered as" + regId);
        }

如果返回空字符串作为注册ID,还需要什么来获取注册ID?

12个回答

10

当设备未成功注册时,将返回空字符串。可能有以下原因:

  1. 将您的GCM代码放入应用程序包中。[您可以使用与应用程序包名称相同的另一个包]
  2. 正确设置所有权限。

2
直到我发现这个问题,我才知道GCM代码必须在应用程序包中。 - howettl
4
是的,你说得对。GCM代码必须在主包中才能正常工作。 - Sanket Patel
@SharpDeveloper,您所说的“GCM代码”是什么意思? - Marcin Orlowski

3
我也遇到了空的注册ID问题,最终解决了。这是我的解决方案:
1)检查项目ID。它应该是Google API控制台中显示的12个字符长的超链接(而不是您在项目摘要中命名的项目ID)
2)尝试将“final String regId”更改为“String regId”。我不知道为什么,但对我有用。
希望能帮到你。

谢谢你的回复,Nick。但在我的情况下,这不是问题。 - techieWings
将注册ID变量中的“final”关键字删除后,问题得到了解决。谢谢! - srgtuszy
1
我误用了项目ID和服务器密钥。感谢第一个解决方案。 - Youngjae
无法在不同方法中定义的内部类中引用非 final 变量 regId。那怎么办? - Pratik Butani
我找不到任何带有超链接的项目ID,我该去哪里获取?我也得到了空的注册ID。 - Madhu
@Madhu 在 Google 开发者控制台中,一旦您创建了 Google API 项目,您可以在地址栏 URL 中找到包含 12 位数字的项目 ID。 - Ajay Takur

1
使用Google控制台创建一个与Eclipse应用程序名称相同的新项目,帮助我解决了这个问题。

1

我遇到了同样的问题,解决方法如下:

您需要实现一个GCMIntentService(继承自GCMBaseIntentService)。 并且不要!!!GCMIntentService重命名为其他名称,这是我遇到问题的原因。


返回-1,因为GCMIntentService只是默认名称(预期在主包中)。但只要您正确完成了getGCMIntentServiceClassName()的覆盖,您可以使用任何您想要的IntentService。 - Marcin Orlowski

1
    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    final String regId = GCMRegistrar.getRegistrationId(this);

    if (regId.equals("")) {
        GCMRegistrar.register(this, "YOUR_ACCOUNT");
    } else {
        app.prefs.edit().putString("prefs_googleid", regId).commit();
        GCMRegistrar.setRegisteredOnServer(this, true);
        Log.v(TAG, "Already registered");
    }

然后等待在扩展GCMBaseIntentService的onRegistered ovverride中接收器中的回调,那里您将获得您的ID注册。

无论如何,我完全创建了一个使用GCM的应用程序,遵循这篇文章:http://developer.android.com/guide/google/gcm/gs.html


感谢Giuseppe,我使用了相同的链接,但是我的应用程序无法进入onRegistered()方法。 - techieWings
你实现了BroadcastReceiver吗? - Giuseppe

0

我已经解决了使用Google项目编号而不是项目名称来注册GCMRegistrar.register的问题。


0

我尝试了Nick Wong的第二种解决方案并且将 => public static final String PROPERTY_REG_ID = "registration_id"; 改为 => public static String PROPERTY_REG_ID = "registration_id";

简单地说,它起作用了。


太好了!对我来说,除了这个之外,我已经正确地实现了所有其他事情,但我的包名有拼写错误。 - techieWings

0
GCMRegistrar.register(this, sender_id); Log.d(TAG, "Registration id : "+GCMRegistrar.getRegistrationId(this));
在调用register()后立即调用getRegistrationId()是有风险的,因为register可能不会立即返回ID。
对于我的情况,我稍后在脚本中进行了检查(在按钮按下时),使用以下代码:
boolean registered = GCMRegistrar.isRegistered(this);
如果已注册,则调用GCMRegistrar.getRegistrationId(this))获取已注册的ID。

0

我也收到了空字符串作为注册ID,并按照以下方式解决:

  1. 检查SenderId是否正确。
  2. 检查您的设备上是否已登录活动Google帐户。
  3. 检查清单文件中权限是否正确定义。

0

请确保您在“app_package”中定义了该服务,因为此意图服务将由GCMBroadcastReceiver调用

例如

<service android:name=".GCMIntentService" />

<service android:name="app_package.GCMIntentService" />

如果没有正确定义服务,将无法回调onRegister,并且您的注册ID始终为空。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接