无法使用 API 级别 16 注册 Android 令牌

Posted

技术标签:

【中文标题】无法使用 API 级别 16 注册 Android 令牌【英文标题】:Unable to register Android token with API level 16 【发布时间】:2015-08-21 19:21:58 【问题描述】:

我有一个使用 Lollipop 且运行良好的 android 应用。我想添加对以前版本的 Android 的支持。我使用 API 级别 16 设置了一个设备,但由于某种原因,我在以下命令中不断收到 NullPointerException:

String token = gcm.register(Config.GOOGLE_PROJECT_ID);

“gcm”当然不为空。

是不是我做错了什么?

编辑:

我做了一些更改并将 API 级别提高到 17。代码现在看起来像这样:

InstanceID instanceID = InstanceID.getInstance(getApplicationContext());
String token = instanceID.getToken(Config.GOOGLE_PROJECT_ID,
                            GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

仍然没有通过命令:

instanceID.getToken

谁能告诉我我做错了什么?

【问题讨论】:

您是否尝试过根据这个问题设置 gcm? ***.com/questions/20820079/… 我建议您切换到使用 InstanceID,它现在是 Android 客户端注册的推荐方式。检查此文档中的第 5 步:developers.google.com/cloud-messaging/android/start 谢谢,我确实切换到了 InstanceID。现在我的应用程序没有崩溃,但它也没有运行以下行之后的任何代码:InstanceID instanceID = InstanceID.getInstance(context)。我也尝试切换到 API 级别 17。我做错了什么?在 API 22 上似乎一切正常。 抱歉,运行此命令失败:String token = instanceID.getToken(Config.GOOGLE_PROJECT_ID, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); 【参考方案1】:

经过进一步调查,我注意到了异常:

java.io.IOException: MISSING_INSTANCEID_SERVICE

我了解到问题与我的模拟器上未安装 Google Play 有关。我不知道为什么 Google 不决定将它自动包含在旧版模拟器中。

我通过以下方式解决了问题:

切换到更快的 Genymotion 模拟器。 在 Genymotion 模拟器上安装 Google Play: 下载可以在网上找到的适当的 Google Play zip 文件(有一个 eacj api 级别的版本)。 在 Genymotion 模拟器上拖放文件。 按照安装步骤重新启动。

采取这些措施后,我不再收到此异常。

【讨论】:

以上是关于无法使用 API 级别 16 注册 Android 令牌的主要内容,如果未能解决你的问题,请参考以下文章

适用于所有 API 级别的 Android 剪贴板代码

Android API 级别 16 及更高级别的 Torch 应用程序

了解 Android API 级别

android api 16 中的 BigDecimal

如何让信任锚在 Android API 级别 16-19 上正常工作

无法在 Android Studio 上更改 API 级别