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

我可以從GCM成功獲取某些Android設備的註冊ID,但不能獲取所有Android設備的註冊ID。 GCM爲某些Android設備返回空註冊ID。 我正在使用GCM.jar文件作爲返回註冊ID的第三方工具。 清單文件中正確定義了所有權限。 發件人ID是正確的。 API密鑰正確。爲什麼GCM爲某些android設備返回空的註冊ID?

回答

6

我不知道究竟在何處被返回一個空註冊ID,但要認識到這一點很重要:

GCMRegistrar.register(this, "517739810110"); 

是一個異步事件,不會立即發生。所以打電話:

GCMRegistrar.getRegistrationId(this); 

之後不會給你註冊ID只有一個空白字符串。爲了您的設備已與GCM服務器中註冊後才能正常獲得的註冊ID,你需要處理您GCMBaseIntentService以下回調:

protected void onRegistered(Context context, String registrationId) 

這就是你將得到的註冊ID,並在那裏你應該註冊你的應用服務器。您應該使用GCM client sample作爲指南對如何做到這一點:

@Override 
protected void onRegistered(Context context, String registrationId) { 
    Log.i(TAG, "Device registered: regId = " + registrationId); 
    displayMessage(context, getString(R.string.gcm_registered, 
      registrationId)); 
    ServerUtilities.register(context, registrationId); 
} 

,也應該遵循怎樣的GCM客戶樣品登記,在它的DemoActivity

final String regId = GCMRegistrar.getRegistrationId(this); 
if (regId.equals("")) { 
    // Automatically registers application on startup. 
    GCMRegistrar.register(this, SENDER_ID); 
} 

注意,它不查詢的在調用register()方法後立即註冊ID。

+1

但現在不推薦使用GCMBaseIntentService。什麼是替代 – stinepike

+0

多久,我應該等待從該回調獲得結果> –

0

調用這個方法兩次,因爲有些時候在準備好的Android上沒有那個ID String Id = Notification();

if(Id.equals("")){ 
String Id = Notification(); 
}   

    private String Notification() { 
       registerReceiver(mHandleMessageReceiver, new IntentFilter(
         DISPLAY_MESSAGE_ACTION)); 
       final String regId = GCMRegistrar 
         .getRegistrationId(ActivateScreen.this); 

       // Check if regid already presents 
       if (regId.equals("")) { 
        // Registration is not present, register now with GCM 
        GCMRegistrar.register(ActivateScreen.this, SENDER_ID); 
       } else { 
        // Device is already registered on GCM 
        if (GCMRegistrar.isRegisteredOnServer(ActivateScreen.this)) { 
         // Skips registration. 
         // Toast.makeText(getApplicationContext(), 
         // "Already registered with GCM", Toast.LENGTH_LONG) 
         // .show(); 
        } else { 
         final Context context = ActivateScreen.this; 
         mRegisterTask = new AsyncTask<Void, Void, Void>() { 
          @Override 
          protected Void doInBackground(Void... params) { 
           // Register on our server 
           // On server creates a new user 
           ServerUtilities.register(context, "", "", regId); 
           return null; 
          } 

          @Override 
          protected void onPostExecute(Void result) { 
           mRegisterTask = null; 
          } 
         }; 
         mRegisterTask.execute(null, null, null); 
        } 
       } 

       Log.i("Device Id", appId); 
       return regId; 
      }