2

我终于获得了使用GCM(Google Cloud Messaging)的应用程序。但我有一个问题。在注册完成后的那一刻,我想获得registrationId。除了registrationId是空的,除非我重新启动应用程序,它会给出一个值。注册完成后,GCM - registerID为空

基本上我想要的是在注册完成后取回registerId。

这是我使用的代码:

checkNotNull(SENDER_ID, "SENDER_ID"); 

GCMRegistrar.checkDevice(this); 
GCMRegistrar.checkManifest(this); 

TextView mDisplay = (TextView) findViewById(R.id.display); 

String regId = ""; 

if (!GCMRegistrar.isRegistered(this)) 
{ 
    mDisplay.setText("registering"); 
    GCMRegistrar.register(this, SENDER_ID); 

    regId = GCMRegistrar.getRegistrationId(this); 
    String url = "localhost/Google-Cloud-Messaging-Server-Test/registration.php?regId=" + regId; 

    Log.i(TAG, "registration url: " + url); 
    HttpRequest httprequest = new HttpRequest(url); 
} 
else 
{ 
    regId = GCMRegistrar.getRegistrationId(this); 

    mDisplay.setText(regId); 
    Log.v(TAG, "Already registered"); 

    GCMRegistrar.unregister(this); 
} 

的问题是,该代码之后达到了这一点:

regId = GCMRegistrar.getRegistrationId(this); 
String url = "localhost/Google-Cloud-Messaging-Server-Test/registration.php?regId=" + regId; 

的REGID是空的。它应该有一个价值,因为注册成功了。 我做错了什么?它是否有可能尝试获取registrationId,而实际上它仍在通过注册过程?

由于提前,
马克

编辑:manifest.xml的内容

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.codeglue.google.cloud.messaging.test" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="10" 
    android:targetSdkVersion="15" /> 

<permission 
    android:name="com.codeglue.google.cloud.messaging.test.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="com.codeglue.google.cloud.messaging.test.permission.C2D_MESSAGE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 

    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

    <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="com.codeglue.google.cloud.messaging.test" /> 
     </intent-filter> 
    </receiver> 

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

</application> 

</manifest> 
+0

你能告诉我们你的清单文件吗? –

回答

0

请检查的manifest.xml,让你有正确或不添加的所有用途,权限和接收器。

 <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/> 
<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<permission 
    android:name="you_package_name.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission 
    android:name="you_package_name.permission.C2D_MESSAGE" /> 
<!-- This app has permission to register and receive data 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="you_package_name" /> 
     </intent-filter> 
    </receiver> 
+0

我得到了所有权限,因为当我重新启动应用程序时,regId有一个值。 – DijkeMark

2
  1. GCMregistrar.register()方法发送com.google.android.c2dm.intent.REGISTER意图(异步地)到谷歌(坐看Registering for GCM docs和GCMregistrar来源,特别是registerinternalRegister方法)。

  2. 然后Google会处理您的com.google.android.c2dm.intent.REGISTER意图并发送com.google.android.c2dm.intent.REGISTRATION以注册ID作为回应的意图。

  3. 然后当com.google.android.c2dm.intent.REGISTRATION意图将来自谷歌(成响应),广播接收器(其注册资格来处理这种类型的意图)将被调用,并且只有注册ID将被保存到SharedPreferences之后。

我提醒getRegistrationId()方法从设备(不是从谷歌),这意味着,才能从SharedPreferences获取ID的SharedPreferences获取ID - 首先应该还有救。 (只有当com.google.android.c2dm.intent.REGISTRATION来自谷歌时,ID才会保存在那里)。我不知道确切位置放置逻辑既节约了ID为SharedPreferences(我想答案应该是到GCMRegistrar sources

所以。

  1. 调用GCMRegistrar.getRegistrationId方法后,正好GCMRegistrar.register方法:在程序中,因为你的registrationID字符串为空。请记住,register方法异步向google发送意向,这意味着在拨打getRegistrationId方法时,系统不会保证您的ID已经收到,并且您的ID已保存到SharedPreferences

如果你想赶上那一刻com.google.android.c2dm.intent.REGISTRATION意向来自谷歌 - 以看GCMIntentServiceonRegistered方法。