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方法。