我无法从Android GCM获取注册ID

时间:2012-07-29 22:03:38

标签: android google-cloud-messaging

虽然我尝试了关于这个问题的其他答案,但是无法解决。 发件人ID正确,添加了权限,API密钥为真。

我使用这篇文章来创建项目: http://developer.android.com/guide/google/gcm/gs.html#server-app

    GCMRegistrar.checkDevice(this);
    GCMRegistrar.checkManifest(this);
    String regId = GCMRegistrar.getRegistrationId(this);
    if (regId.equals("")) {
      GCMRegistrar.register(this, SENDER_ID);
      regId = GCMRegistrar.getRegistrationId(this);
    } else {
      Log.v(TAG, "Already registered");
    }
    String did = getDeviceID();

它返回空字符串。

6 个答案:

答案 0 :(得分:49)

您是否在应用的根源包中GCMIntentService定义了correctly

<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="my_app_package" />
  </intent-filter>
</receiver>

确保"my_app_package"与您应用的主程序包相同,否则您的ID将返回一个空字符串。

另请注意

    GCMRegistrar.register(this, "...");

是异步的。因此,在此之后立即调用GCMRegistrar.getRegistrationId(this)是不可靠的,因此您应该避免使用它。

作为注册程序的一部分,id将通过广播回调到达您的GCMIntentService。然后,您可以在任何地方存储gcm / fcm密钥,并在应用程序的其他部分(通常在服务器上)使用它。

答案 1 :(得分:11)

如果您的应用程序第一次启动,则必须等待GCMIntentService.java文件上的OnRegistered回调。

GCMRegistrar.register(this, SENDER_ID);
// Android does NOT wait for registration ends and executes immediately line below
// So your regId will be empty.
regId = GCMRegistrar.getRegistrationId(this);

GCMIntentService.java:

@Override
protected void onRegistered(Context c, String regId) {
    // You can get it here!
}

修改:较新版本的GCM库(与Google Play服务库捆绑在一起)等待响应并返回注册ID。所以这个答案适用于较旧的GCM库。

答案 2 :(得分:5)

经过一天的努力,我遇到了同样的问题,我找到了解决办法。首先,我将我的GCM相关代码放入我的主程序包,并根据androidManifest.xml中的My Package进行更改

我举一个简单的例子。我的项目名称是GCMExample,我有三个包1. com.examle.GCMExample(主包),2。com.examle.GCMExample.activity(第二个包),3。com.example.GCMExample.adapter(第三个包)< / p>

当我的GCM相关课程文件进入我的第二个包时,我没有获得注册ID

我的GCM相关类,如1. GCMIntentService,2。ServerUtilities,3。CommonUtilities 4. WakeLocker放入我的主包com.example.GCMExample

也是我的androidManifest.xml

     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />
     <uses-permission android:name="android.permission.WAKE_LOCK" />
     <uses-permission android:name="android.permission.VIBRATE" />

     <permission android:name="com.example.GCMExample.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

     <uses-permission android:name="com.example.GCMExample.C2D_MESSAGE" />

    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<receiver
        android:name="com.google.android.gcm.GCMBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
        <!-- Receives the actual messages. -->
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <!-- Receives the registration id. -->
        <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

        <category android:name="com.example.GCMExample" />
      </intent-filter>
</receiver>  

<service android:name="com.example.GCMExample.GCMIntentService" />

答案 3 :(得分:2)

注册app com.example.ilkgcm发件人&#34; my_sender_id&#34; - 此错误表示您未能更改您的my_sender_id&#39;到有效的发件人ID,这将是一个12个字母的代码。

答案 4 :(得分:1)

如果您没有收到来自注册的响应。主要原因之一是您的清单文件未正确配置...特别是在“和”中提供“package_name”(您的应用程序包名称如com.xxx.yyy)正确。

答案 5 :(得分:1)

例如,您的接收者类名称是:“MyCustomIntentService.java”,只需将此名称更改为“GCMIntentService.java”,然后再次尝试。这是简单的解决方案。只需在SRC区域更改文件名即可。