当前位置: 首页 > 知识库问答 >
问题:

GCM服务在Android 2.2上不可用

方苗宣
2023-03-14

我得到的错误SERVICE_NOT_AVAILABLE我GoogleCloudMessaging.register()调用Android 2.2设备。

我写一个应用程序,使用谷歌云消息使用新的谷歌播放服务。我使用Android网站上提供的指南实现了它,我的源代码包含了大量的错误检查和处理代码,例如确保安装或更新Google Play服务。GCM注册码还实现了指数退避作为谷歌建议一个实现来处理SERVICE_NOT_AVAILABLE错误。

我已经在一系列设备上测试了我的应用程序,包括ICS、JB、Honeycom甚至2.3。x设备。GCM注册工作正常,我可以通过GCM向其发送消息。然而,在2.2设备上,我在Google CloudMessaging上不断收到服务不可用的错误。register()调用,即使指数回退已就位。

GCM失败的设备是三星SGH-I896,确切地说,手机上有两个谷歌账户。我已经读到这个错误可能是由错误配置的时间引起的,但是时间被设置为自动的。这款手机没有改装,正在运行三星股票ROM。

我也尝试过重新启动设备,以及重新安装谷歌播放服务没有运气。在这个问题上的任何帮助都将不胜感激。

编辑:我尝试使用旧的GCM实现GCM。jar和gcmregistar,它最终在设备上工作。然而,由于谷歌已经不再支持这个方法,所以我几乎不认为这是一个很好的解决方案。

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

共有3个答案

林威
2023-03-14

服务不可用可能是由旧的或丢失的GooglePlayServices造成的。使用GooglePlayServicesUtil检查版本,如果错误,则重定向到市场,以便用户可以手动安装-这将修复服务不可用,并获得所有改进和错误修复(以及新错误:-)。

如果做不到这一点--那么就没有必要使用寄存器(),方法需要匹配的播放服务来检索结果。为了向后兼容,它确实生成相同的广播。直接使用REGISTER意图或者弃用的库将继续工作——我建议使用该意图,GCM注册器与谷歌服务框架中的旧实现相关联(它调用intent.set包(GSF_PACKAGE)),所以它不能从任何修复中受益。

拥有最新版本的GCM——通过使用GooglePlayServicesUtil处理没有自动安装的设备——不仅有助于注册。

穆丁雨
2023-03-14

这个错误也发生在我身上,但它确实发生了,因为我试图通过公司的防火墙在GCM注册。在我找到的留档里:

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

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

卢嘉誉
2023-03-14

我也经历了同样的问题。GCM在运行Android4.04的平板电脑上运行良好,但在运行Android2.3的智能手机上总是收到SERVICE_NOT_AVAILABLE。

我发现下面的工作区没有使用(据我所知)任何弃用的类。将操作"com.google.android.c2dm.intent.注册"添加到清单中的GCMBroadcastRecector。这将使您能够在GCMBroadcastRecector上接收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可以接收注册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错误,我可以处理registration_id在我的GCMBroadcastRecector,我能够发送消息到我的智能手机。很奇怪,但对我有用。

 类似资料:
  • 我正在尝试,为了实施新的GCM,我遵循Google get声明:http://developer.android.com/guide/google/gcm/gs.html 我被困在获取我的设备注册ID! 我的应用程序一直试图与谷歌服务器连接,这里我的错误日志: 这是我的活动代码,询问身份证: 这是我的服务代码 这是我的Android清单: 我遵循谷歌的指示,但我坚持这个服务不可用的错误, 我做错了

  • 我面临着GCM设备注册的问题,但它似乎仅限于运行Android 5.0版(Lollipop)的设备。 我已经能够在除了运行Lollipop的设备之外的所有其他设备上成功地测试推送通知。我总是收到GCM服务不可用的错误。 我正在尝试运行

  • 我正在尝试运行一个3节点的Kubernetes集群。我已经启动并充分运行了集群,使得服务可以在不同的节点上运行。不幸的是,我似乎无法让基于NodePort的服务正确工作(就我所理解的正确性而言……)。我的问题是,我定义的任何NodePort服务都只能在其pod运行的节点上外部可用,我的理解是,它们应该在集群中的任何节点上外部可用。 一个例子是本地Jira服务,它应该在端口8082(内部)上运行,在

  • 我正在使用Android GCM,而没有在我的设备上安装Google Play服务?用GCM发送推送通知而不安装Google Play服务的方法是什么?

  • 这款设备运行的是Android4.2.2系统,谷歌官方GCM文档显示: 运行Android4.0.4或更高版本的设备不需要谷歌帐户。 但是这些文档与使用的新版GCM相关(对我来说不是一个选项) 基本上,我的问题是: 有没有可能使GCM在没有Google帐户的情况下工作, 使用旧的、不推荐使用的GCM帮助程序库? 注意:我不能在设备上创建Google帐户(这是一个要求) 如果这是不可能的,那么请建议

  • 我设置了一个 AWS 服务器和一个使用 GCM 和 SNS 推送通知的Android应用程序。 应用程序注册成功,即收到带有注册ID的通知。 有没有办法检查设备是否收到了通知,但由于某种原因没有发送到< code>BroadcastReceiver? 此外,可能我做了一些错误的事情(可能是包名)?以下是清单: