为啥 GCM 会为某些 android 设备返回空的注册 ID?

Posted

技术标签:

【中文标题】为啥 GCM 会为某些 android 设备返回空的注册 ID?【英文标题】:Why GCM returns empty registration id for some android devices?为什么 GCM 会为某些 android 设备返回空的注册 ID? 【发布时间】:2013-01-17 10:25:22 【问题描述】:
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 设备。 GCM 会为某些 Android 设备返回空的注册 ID。 我使用 GCM.jar 文件作为返回注册 ID 的第三方工具。 所有权限都在清单文件中正确定义。 发件人 ID 正确。 API 密钥正确。

【问题讨论】:

【参考方案1】:

我不确定返回空白注册 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。

【讨论】:

但现在 GCMBaseIntentService 已被弃用。有什么选择 我应该等待多长时间才能从该回调中获得结果>【参考方案2】:

调用此方法两次,因为有时在准备好的 Android 上没有获得该 ID 字符串 ID = 通知();

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;
            

【讨论】:

以上是关于为啥 GCM 会为某些 android 设备返回空的注册 ID?的主要内容,如果未能解决你的问题,请参考以下文章

对于某些 android 设备,GCM 消息在 GCM 服务器上停留在“已接受”状态

为啥我无法在 Android 设备上接收来自 GCM 的消息

某些 android 设备未收到 GCM 推送通知

Android GCM 发送成功但在某些设备上未收到

某些设备在 android 中未收到推送通知

GCM 通知仅到达某些设备