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();
     }
}

一部の Android デバイスでは GCM から登録 ID を正常に取得できますが、すべての Android デバイスでは取得できません。一部の Android デバイスでは、GCM が空の登録 ID を返します。登録 ID を返すサードパーティ ツールとして GCM.jar ファイルを使用しています。すべてのアクセス許可がマニフェスト ファイルで正しく定義されています。送信者 ID は正しいです。API キーは正しいです。

4

2 に答える 2

6

空白の登録 ID が返される正確な場所はわかりませんが、次のことを認識することが重要です。

GCMRegistrar.register(this, "517739810110");  

は非同期イベントであり、すぐには発生しません。だから呼び出す:

GCMRegistrar.getRegistrationId(this);

直後は、登録 ID に空白文字列のみが表示されます。デバイスが GCM サーバーに登録された後に登録 ID を適切に取得するには、GCMBaseIntentService で次のコールバックを処理する必要があります。

protected void onRegistered(Context context, String registrationId)

ここで登録 ID を取得し、アプリケーション サーバーに登録する必要があります。これを行う方法のガイドとして、 GCM クライアント サンプルを使用する必要があります。

@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 を照会しないことに注意してください。

于 2013-01-17T15:33:37.833 に答える
0

準備ができている Android で ID String Id = Notification(); を取得できない場合があるため、このメソッドを 2 回呼び出します。

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;
            }
于 2013-10-18T11:22:44.623 に答える