安卓:在某些设备上出现FCM java.io.IOException: SERVICE_NOT_AVAILABLE错误

26
我在项目中使用了 FCM,它能够在 Sony Xperia、Galaxy S6、Motorola 等设备上正常运行。但是在 Galaxy S3 上出现了 "java.io.IOException: SERVICE_NOT_AVAILABLE" 错误。Galaxy S3 的时间是自动同步的,并且 Google Play 已经更新。网络连接强度也很好,我没有使用代理连接到公共互联网。

3
您可以参考这个帖子。这个错误意味着您的设备无法读取响应,或者服务器返回了500/503。您应该使用指数级退避和重试。 - abielita
@abielita 我的应用程序在尝试从结果中检索令牌时崩溃,并显示Fatal Exception: com.google.android.gms.tasks.RuntimeExecutionException java.io.IOException: SERVICE_NOT_AVAILABLE。因此,我的问题是如何防止应用程序因此错误而崩溃? - Stella
1
在访问结果之前,请检查以下内容: if(task != null && task.isSuccessful()) {task.getResult()} 这个检查将避免应用程序崩溃。 - Vijayalaxmi
5个回答

22

当设备无法注册到Firebase时,会出现此错误。确保在调用此代码时互联网正常工作。并将代码放在try-catch块中,以防止应用程序崩溃。

编辑: 要么在注册设备或获取令牌之前添加一个互联网连接检查。 或者 将获取令牌的代码放在try-catch块中,以防止应用程序崩溃。

示例:

1. 添加互联网连接检查代码:
```java private boolean isNetworkConnected() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected(); } ```
2. 进行互联网检查并继续执行。
```java if (isNetworkConnected()) refreshToken(this); ```

3
请提供一个样例try-catch代码块……谢谢 - aLL
1
此外,在我的情况下,问题可能是当手机连接到Charles代理时。 - Yurii
1
我打开了互联网,它正常工作了。非常感谢! - undefined

8

请确保您已经在重写的 onComplete 方法中包含如下代码 -

task.isSuccessful()

FirebaseMessaging.getInstance().getToken() .addOnCompleteListener(new OnCompleteListener() {

        @Override
        public void onComplete(@NonNull Task<String> task) {
            if(task.isSuccessful()) {
                fcmToken = task.getResult();
            }
        }
    });
如果在注册FCM令牌时发生网络错误或其他问题,您可能会收到FIS_Authentication_Failed或SERVICE_NOT_AVAILABLE类型的错误提示。

7

请检查以下内容:

1- 网络连接是否正常

2- 手机日期/时间是否正确


1
2- 手机日期/时间必须正确 为什么会导致这个问题? - Dmitry Zinoviev
1
日期和时间是问题所在,谢谢。 - dpjanes

3
在我的情况下,问题出在Google Mobile Services应用程序上。清除其数据后,问题消失了。
在另一台设备上启动后,我发现了问题的关键,该问题无法再现。

1
这是我解决问题的步骤:
  • 确保我的 Android 应用在 Play 商店上的 SHA1 已添加到无限制应用列表中。
  • 确保 Play 商店凭据的 google_oauth_client 在代码和 google-services.json 文件中都被使用。
  • 确保我的 Android 应用在 Play 商店上的 SHA1 已添加到 Firebase 中。
  • 然后,我清除了我的 Pixel 6 上 Google Play 服务应用的缓存和存储。
  • 从 Play 商店卸载并重新安装应用程序,然后,哇,应用程序能够获取令牌。
- Jamie

1
如果仍然遇到错误,请尝试在useEffect中添加getToken和其他Firebase消息调用,并将messaging作为其依赖项。
有时,应用程序在初始化消息库之前尝试调用这些方法,因此请尝试使用具有消息作为依赖项的useEffect包装您的代码。
import messaging from '@react-native-firebase/messaging';

React.useEffect(() => {
  // Get the token
  const token = await messaging().getToken();
  // other messaging operations
}, [messaging])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接