我无法从Android GCM获取注册ID

尽pipe我对这个问题尝试了其他的答案,但这个问题是无法解决的。 发件人ID是正确的,权限被添加,API密钥是真实的。

我使用这个post来创build项目: 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(); 

它返回空string。

Solutions Collecting From Web of "我无法从Android GCM获取注册ID"

你有GCMIntentService 正确定义在你的应用程序的根包?

 <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将返回一个空string。

还要注意

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

是asynchronous的。 因此,之后立即调用GCMRegistrar.getRegistrationId(this)是不可靠的,所以你应该避免它。

作为注册过程的一部分,id将通过广播callback到达GCMIntentService 。 从那里你可以比任何你喜欢的地方存储gcm密钥,并在应用程序的其他部分(通常在服务器上)使用它。

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

 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库(与谷歌播放服务库捆绑在一起)等待响应并返回注册ID。 所以这个答案是旧的GCM库。

我经历了一天的奋斗之后,也遇到了同样的问题 首先我把我的GCM相关代码放到我的主包中,并根据我的包在androidManifest.xml中进行更改

我给你简单的例子。 我的项目名称是GCMExample,我有三个包1. com.examle.GCMExample(Main Package),2. com.examle.GCMExample.activity(Second Package),3. com.example.GCMExample.adapter(Third Package)

当我的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" /> 

注册发件人“my_sender_id”的应用程序com.example.ilkgcm – 此错误表明您没有将您的“my_sender_id”更改为有效的发件人ID,该ID将为12个字母的代码。

如果你没有得到注册的回应,其中一个主要原因是你的清单文件没有正确configuration…尤其是给“package_name”(你的应用程序包名称,如com.xxx.yyy)和正确。

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