2013-01-11 17 views
6
private void registerClient() { 
    try { 
     GCMRegistrar.checkDevice(this); 
     GCMRegistrar.checkManifest(this); 
     regId = GCMRegistrar.getRegistrationId(this); 
     if (regId.equals("")) { 
      registrationStatus = "Registering..."; 
      GCMRegistrar.register(this, "1074338555805"); 
      regId = GCMRegistrar.getRegistrationId(this); 
      registrationStatus = "Registration Acquired"; 
      sendRegistrationToServer(); 
     } else { 
      registrationStatus = "Already registered"; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     registrationStatus = e.getMessage(); 
    } 
} 

註冊ID在Android 2.3.3,2.3中爲gcm .5但它不是null並在android 2.3.4,4.0.4中工作。在Android 2.3.3,2.3.5中,gcm的註冊ID爲null,但它不爲null,並且在android 2.3.4,4.0.4中工作。

+1

這是否幫助? http://stackoverflow.com/questions/11713363/i-can-not-get-registration-id-from-android-gcm – trojanfoe

+0

我有同樣的問題 –

+1

@ trojanfoe的評論中的最佳答案包含您的解決方案。 'GCMRegistrar.register'是異步的,因此在調用'getRegistrationId'後立即不可靠。處理Google服務通過ID向您發送的廣播。 – tophyr

回答

0

正如Google Play服務設置指南中清楚說明的那樣。

https://developer.android.com/google/gcm/client.html

應用的OnCreate:

// Check device for Play Services APK. If check succeeds, proceed with 
    // GCM registration. 
    if (checkPlayServices()) { 
     gcm = GoogleCloudMessaging.getInstance(this); 
     regid = getRegistrationId(context); 

     if (regid.isEmpty()) { 
      registerInBackground(); 
     } 
    } else { 
     Log.i(TAG, "No valid Google Play Services APK found."); 
    } 

註冊在後臺代碼:

/** 
* Registers the application with GCM servers asynchronously. 
* <p> 
* Stores the registration ID and app versionCode in the application's 
* shared preferences. 
*/ 
private void registerInBackground() { 
    new AsyncTask() { 
    @Override 
    protected String doInBackground(Void... params) { 
     String msg = ""; 
     try { 
      if (gcm == null) { 
       gcm = GoogleCloudMessaging.getInstance(context); 
      } 
      regid = gcm.register(SENDER_ID); 
      msg = "Device registered, registration ID=" + regid; 

      // You should send the registration ID to your server over HTTP, 
      // so it can use GCM/HTTP or CCS to send messages to your app. 
      // The request to your server should be authenticated if your app 
      // is using accounts. 
      sendRegistrationIdToBackend(); 

      // For this demo: we don't need to send it because the device 
      // will send upstream messages to a server that echo back the 
      // message using the 'from' address in the message. 

      // Persist the regID - no need to register again. 
      storeRegistrationId(context, regid); 
     } catch (IOException ex) { 
      msg = "Error :" + ex.getMessage(); 
      // If there is an error, don't just keep trying to register. 
      // Require the user to click a button again, or perform 
      // exponential back-off. 
     } 
     return msg; 
    } 

    @Override 
    protected void onPostExecute(String msg) { 
     mDisplay.append(msg + "\n"); 
    } 
    }.execute(null, null, null); 
    ... 
}