为啥 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 服务器上停留在“已接受”状态