Android - Firebase - TaskSnapshot - 方法只应在私有范围内访问?

51

一切都很顺利,直到我从三个月的休假回来并将我的Firebase从9.8更新到10.0.1。

现在,我所有对于 TaskSnapshot 的调用都出错了。

这是之前运行良好的示例代码:

OnSuccessListener<UploadTask.TaskSnapshot> successListener = new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        attachments.add(fileName + "*-*" + taskSnapshot.getDownloadUrl().toString());

        numberOfCallbacks++;
        if (numberOfFiles == numberOfCallbacks) {
            currentUpload = false;
            onClickSendAlert(sendingView);
        }
    }
};
我现在遇到的错误与 taskSnapshot.getDownloadUrl() 相关。Android Studio 在那一行下划了红线,并显示:

This method should only be accessed from tests or within private scope

请问有人能解释一下为什么会出现这种情况吗?我已经进行了两天的研究,但就是想不明白(尴尬)。如果有用的话,这段代码是用来上传文件到 Firebase Storage 的,然后当它完成时 (OnSuccess),它会获取下载 URL 并将其存储在 Firebase Database 中。这在我更新到 10.0.1 之前非常有效。我在另一个模块中的下载任务也遇到了同样的错误。
这里有一张截图,以便更好地理解我的情况:

enter image description here


1
我应该补充一点,只要我将Firebase和Google Play服务更改回9.8.0,所有错误都会消失。 - Ryan
我最终也降级回到了9.8.0版本,一切都恢复正常了。我很讨厌自己没有时间去解决这个问题。除非有人能够解决它,否则我将被困在9.8.0上。不过这个项目几乎已经完成了,所以应该不会有太大影响。 - Ryan
1
我也遇到了这个问题,但我能够构建,所以我不确定为什么它标记为错误而不是警告。想知道正确的方法是什么。 - Travis Christian
1
Firebase的指南甚至在其示例中使用了这种方法:https://firebase.google.com/docs/storage/android/upload-files。可能是一个疏忽。不是最好的办法,但可以禁用检查。 - JacksOnF1re
1
对我来说,这个错误出现在Android Studio 2.3上,在升级之前我使用10.2.0没有问题。 - Bronx
显示剩余3条评论
4个回答

64

这个问题似乎是由于过于严格的 Lint 检查引起的。尝试类似以下的解决方法:

@SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl();

这个技巧对我有用。如果问题与这个错误报告有关,那么应该在2.4中得到修复。


由于某些原因,这个注释对我来说并没有消除警告。 - IgorGanapolsky
很抱歉听到这个消息!我正在使用Android Studio 2.3和Firebase 10.2.0,我刚刚仔细检查了一下,当我删除注释时,警告会重新出现,而当我重新添加注释时,警告会消失。 - Rapunzel Van Winkle
如果您点击红色下划线文本(getDownloadUrl)并按下alt-Enter,上下文菜单是否会显示“常量和资源类型不匹配的检查选项”?还是提到其他检查?如果您在菜单选项上点击右箭头,它将为您提供更多选项(例如“抑制语句”),以使警告消失(这可能是明智的,也可能不是,具体取决于警告的内容)。 - Rapunzel Van Winkle
我没有从 alt-Enter 得到上下文菜单。但是,我通过将注释放在正确的位置来消除错误。我没有将它放在正确的代码块上。 - IgorGanapolsky
谢谢!我最终休息了很长时间才重返开发,当我回来并升级到10.2.0时,问题已经消失了:)我想时间可以治愈一些事情哈哈。 - Ryan
如果 @SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl(); 不起作用,那么请将 Firebase 版本更改回 9.8.0。 - Aayush Upadhyay

6
我也遇到了同样的问题,但suppressWarnings对我无效。为了获取完整的下载URI,我使用了以下代码:
ref.putFile(imagePath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                     Log.d("URL", uri.toString());
                    // This is the complete uri, you can store it to realtime database
                }
            });
        }
    });

希望这能帮到某些人。

0

我曾经遇到过同样的问题,当我更新了Firebase版本后,问题就解决了。我之前使用的是10.0.1版本,现在我使用的是11.0.0版本。


0

使用

@VisibleForTesting
internal val something

或者

@VisibleForTesting
internal fun foo()

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