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

Raj*_*Raj 4 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();
     }
}
Run Code Online (Sandbox Code Playgroud)

我可以成功地从某些Android设备获取GCM的注册ID,但不能获取所有Android设备的注册ID.GCM返回某些Android设备的空注册ID.我使用GCM.jar文件作为第三方工具,它返回注册ID.所有权限都在清单文件中正确定义.发件人ID是正确的.API密钥是正确的.

sel*_*ine 6

我不确定返回空白注册ID的确切位置,但重要的是要意识到:

GCMRegistrar.register(this, "517739810110");  
Run Code Online (Sandbox Code Playgroud)

是一个异步事件,不会立即发生.所以打电话:

GCMRegistrar.getRegistrationId(this);
Run Code Online (Sandbox Code Playgroud)

之后不会给你注册ID只有一个空白字符串.为了在设备向GCM服务器注册后正确获取注册ID,您需要在GCMBaseIntentService中处理以下回调:

protected void onRegistered(Context context, String registrationId)
Run Code Online (Sandbox Code Playgroud)

在这里,您将获得注册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);
}
Run Code Online (Sandbox Code Playgroud)

您还应该遵循GCM客户端示例在其DemoActivity中注册的方式:

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

请注意,在调用register()方法后,它不会立即查询注册ID.