android - Android 2.2 上的 GCM SERVICE_NOT_AVAILABLE

标签 android android-2.2-froyo google-cloud-messaging google-play-services service-not-available

我在 Android 2.2 设备上调用 GoogleCloudMessaging.register() 时收到错误“SERVICE_NOT_AVAILABLE”。

我正在使用新的 Google Play 服务编写一个使用 GoogleCloudMessaging 的应用程序。我使用 Android 网站上提供的指南实现了它,我的源代码包含许多错误检查和处理代码,例如确保安装或更新 Google Play 服务。 GCM 注册代码还按照 google 的建议实现了指数退避,以实现处理 SERVICE_NOT_AVAILABLE 错误。

我已经在各种设备上测试了我的应用程序,包括 ICS、JB、Honey Comb 甚至 2.3.x 设备。 GCM 注册有效,我可以通过 GCM 向它发送消息。但是,在 2.2 设备上,即使有指数退避,我也会在 GoogleCloudMessaging.register() 调用中不断收到 SERVICE_NOT_AVAILABLE 错误。

确切地说,GCM 失败的设备是三星 SGH-I896,手机上有 2 个谷歌帐户。我读过这个错误可能是由错误配置的时间引起的,但时间设置为自动。手机未进行调制,正在运行三星股票 ROM。

我也尝试过重新启动设备以及重新安装 Google Play 服务,但都没有成功。对此问题的任何帮助将不胜感激。

编辑:我尝试使用旧的 gcm.jar 和 GCMRegistrar 实现 GCM,它最终在设备上运行。但是我几乎不认为这是解决问题的好方法,因为 Google 已经停止支持这种方法了。

EDIT2:查看接受的答案。

最佳答案

我遇到了同样的问题。 GCM 在运行 Android 4.04 的平板电脑上运行良好,但在运行 Android 2.3 的智能手机上总是收到 SERVICE_NOT_AVAILABLE。

我发现以下解决方法不使用(据我所知)任何已弃用的类。将操作“com.google.android.c2dm.intent.REGISTRATION”添加到 list 中的 GCMBroadcastReceiver。这将使您能够在您的 GCMBroadcastReceiver 接收registration_id。

<receiver
   android:name="YOUR_PACKAGE_NAME.GCMBroadcastReceiver"
   android:permission="com.google.android.c2dm.permission.SEND" >
      <intent-filter>
         <action android:name="com.google.android.c2dm.intent.RECEIVE" />
         <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

         <category android:name="YOUR_PACKAGE_NAME" />
      </intent-filter>
</receiver>

之后,您的 GCMBroadcastReceiver 就能够接收到 registration_id:

public void onReceive(Context context, Intent intent) {
   String regId = intent.getExtras().getString("registration_id");
   if(regId != null && !regId.equals("")) {
      /* Do what ever you want with the regId eg. send it to your server */
   }
}

虽然我仍然收到 SERVICE_NOT_AVAILABLE 错误,但我可以在 GCMBroadcastReceiver 中处理registration_id,并且可以向我的智能手机发送消息。很奇怪,但它对我有用。

关于android - Android 2.2 上的 GCM SERVICE_NOT_AVAILABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17618982/

相关文章:

android - Horizo​​ntalScrollView 在 RTL 模式下不向左滚动

java - Android JNI 调用方法 GetStringUTFLength 崩溃

android - 如何在 Android 中的 1 个 XML 文件中设置不同的布局

java - 由于设备缺少 google 软件包,Android 中的 GCM 崩溃

java - TextSecure 服务器、Signal Android 应用程序和推送服务器配置

android - 方法 getChildFragmentManager() 未定义

android - 导航组件 : pass safeArgs from activity to a fragment

android - 适用于 Android 2.2 的 VideoView 源代码

android - 在 Android 2.x 中是否有记录的方法来检查多个 SD 卡的内容?

android - Android : battery usage? 下的 Websockets 与 GCM