com.google.firebase.firestore.FirebaseFirestoreException: 因客户端离线而无法获取文档。Android

29

我遇到这个运行时错误,但不明白其中的原因。

com.google.firebase.firestore.FirebaseFirestoreException: 客户端离线,无法获取文档。

以下是我在Activity中尝试从云Firestore获取数据的代码:

DocumentReference docRef = db.collection("room-id-1").document("participan-name-1");
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document != null) {
                    Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData());
                    userData.registerUserToHotspot(roomId_str, participantName_str);
                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                Log.d(TAG, "get failed with ", task.getException());
            }
        }
    });

有什么我可以做的吗?


我也遇到了同样的问题。FirebaseFirestoreException.Code 是“UNAVAILABLE”。这意味着“服务当前不可用。这很可能是一个短暂的情况,可以通过退避重试来纠正。”我现在不知道该怎么办了... - yoonhok
2
同样的问题,有什么解决方案吗? - Daniel
4
有进展吗?这是一个绝对的交易破坏者。无法在Android上使用Firestore吗? - studiobrain
你得到任何解决方案了吗? - Md. Enamul Haque
只有在运行模拟器的情况下才会出现这个错误。如果我删除Firestore模拟器的代码,一切都可以正常工作。 - Aayush Goyal
显示剩余3条评论
9个回答

4
这是因为OnCompleteListener在任务完成时被触发,无论成功或失败。为了避免错误,您可以使用单独的OnSuccessListenerOnFailureListenerOnSuccessListener会在任务成功完成时被调用,但如果出现上述错误,OnFailureListener将被触发,您可以在监听器的onFailure()方法中处理该错误。
编码愉快 :)

3
如果没有任何帮助并且你确认所有都准备就绪,请按照以下步骤进行操作:
1. 清理项目(Build -> Clean Project)。您还可以使用“清除项目”来“使缓存失效”,以获得更安全的清理。 2. 从项目中删除 google-services.json 并同步。 3. 构建项目。Android Studio会抛出有关缺少 google-services.json 的构建异常,这是正常现象。 4. 从Firebase控制台重新下载 google-services.json,将其放入项目并同步。 5. 构建和运行。
希望我能对某些人有所帮助。

1

当我使用错误的路径到文档时,我遇到了相同的异常。当我修复路径后,它开始正常工作。

无论如何,错误信息是误导性的。


1
在我的情况下,解决方案是在Android Studio中创建一个新的模拟器并在其中运行应用程序。

0
我在API 19以下的模拟器上遇到了这个问题,并向Firebase支持团队寻求帮助。 他们回复我说这是一个安全连接问题,并建议我在该模拟器上启用TLS。 据我所知,Firebase需要最新的安全提供程序来进行连接。 如果您认为所有Firebase配置都正确,但仍在API 19以下的模拟器上遇到此问题,请确保模拟器具有最新的安全提供程序。
请查看此链接中的“Android上的TLS”部分:https://github.com/grpc/grpc-java/blob/master/SECURITY.md#tls-on-android 谷歌表示通过Google Play服务提供最新的提供程序。如果您想使用它,可以参考相关文档。

https://developer.android.com/training/articles/security-gms-provider.html


0

对我来说,我遇到了这个问题,是因为我忘记从Firebase控制台初始化我的Firestore数据库。希望这能帮助其他人。


0

在执行任何删除或其他建议的操作之前,先尝试以下两个方法:

  • 重新启动您正在测试的移动设备。
  • 连接到另一个互联网连接并尝试。

对我来说,我的设备连接到了一个公共无线网络,但是即使在几分钟前还能正常使用,现在却无法上网。我的情况是我在我的安卓设备上删除并重新安装了应用程序,然后开始出现相同的错误。所以以上两个方法对我起作用了。


0
如果您正在使用RxJava,那么通过以下方式捕获Throwable将变得简单:
RxFirestore.getDocument(FirebaseFirestore.getInstance()
    .collection("info")
    .document("app"))
    .subscribeOn(Schedulers.io())
    .subscribe(snapshot -> {

    }, throwable -> Timber.e(throwable))

否则尝试在Promise或/和try-catch块中捕获它


0

最近我遇到了这个问题,我尝试删除并重新安装模拟器,但仍然无法解决。因此,我决定捕获错误并在出现特定错误时重试查询。如果用户真的离线了,我会包含一个超时时间,否则它将在重试后检索数据。

    fun makeFirestoreQuery(){
         fireStoreDb
        .collection(Constants.USER_DATA)
        .document(currentUserEmail)
        .get()
        .addOnSuccessListener{documentSnapshot->
        //perform opertion with the data
        }.addOnFailureListener{exception->
        if(exception.message?.contains("Failed to get document because 
        the client is offline")){
        makeFirestoreQuery() //recursively call itself
        //if the user is really offline, set a time out
        }}
    }

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