Android 2.2上的GCM SERVICE_NOT_AVAILABLE

idu*_*olz 16 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注册码还实现了谷歌的指数退避,建议用来处理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,它最终在设备上工作.但是我几乎不认为这是一个很好的解决方案,因为谷歌已经停止支持这种方法了.

编辑2:看到接受的答案.

mar*_*ish 52

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

我发现以下解决方法不使用(据我所知)任何已弃用的类.将动作"com.google.android.c2dm.intent.REGISTRATION"添加到清单中的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>
Run Code Online (Sandbox Code Playgroud)

之后,您的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 */
   }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这肯定很奇怪,但它对我也有用. (2认同)

Edi*_*cer 5

这个错误也发生在我身上,但确实是因为我试图通过我公司的防火墙在GCM中注册.在我发现的文档中:

"注意:如果您的组织有防火墙限制进出互联网的流量,您需要将其配置为允许与GCM连接,以便您的Android设备接收消息.要打开的端口是:5228,5229,以及5230. GCM通常仅使用5228,但有时使用5229和5230. GCM不提供特定的IP,因此您应该允许防火墙接受到Google的ASN 15169中列出的IP块中包含的所有IP地址的传出连接. "

一旦我打开端口或尝试从另一个网络,它工作.