为什么GCM会为某些Android设备返回空注册ID?

时间:2013-01-17 10:25:22

标签: android google-api google-cloud-messaging

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

2 个答案:

答案 0 :(得分: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 :(得分: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;
            }