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 设备。GCM 会为某些 Android 设备返回空的注册 ID。我使用 GCM.jar 文件作为返回注册 ID 的第三方工具。所有权限都在清单文件中正确定义。发件人 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();

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 回答