如何从Firebase Storage获取下载链接?

6
我希望从Firebase的uploadTask.addOnProgressListener方法中获取下载链接。如何使用以下代码获取下载链接?
    UploadTask uploadTask = storageRef.putBytes(data);

    uploadTask.addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>()
    {
        @Override
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot)
        {
            Log.d("aaaaasessin",""+taskSnapshot.getTask().getResult());
        }
    });

我使用了taskSnapshot.getTask().getResult(),但是它没有起作用。
1个回答

12

编辑于2019年8月22日:

在Android SDK的StorageReference类中,最近添加了一个名为list()的新方法。

要解决这个问题,你需要循环遍历ListResult并调用getDownloadUrl()来获取每个文件的下载URL。请记住,getDownloadUrl()方法是异步的,因此它返回一个Task对象。有关详细信息,请参见下面的内容。我甚至写了一篇关于这个主题的文章:


为了获取下载链接,您需要使用addOnSuccessListener,就像以下代码行中所示:
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String url = uri.toString();

                //Do what you need to do with url
            }
        });
    }
});

Firebase发布说明所述,于2018年5月23日:

Cloud Storage版本16.0.1

删除了已弃用的StorageMetadata.getDownloadUrl()和UploadTask.TaskSnapshot.getDownloadUrl()方法。要获取当前的下载URL,请使用StorageReference.getDownloadUr()。

因此,现在在StorageReference对象上调用getDownloadUrl()将返回一个Task对象,而不再是Uri对象。

请注意,如果您的设备无法访问Firebase存储后端,则成功监听器和失败监听器(如果您打算使用它)都不会被调用。只有在数据提交或被Firebase服务器拒绝时,才会调用成功/失败监听器。


谢谢您的回答,但是我要离线执行上传任务,所以无法使用 onSuccsess()。我只能使用 uploadTask.addOnProgressListener()。 - ajay dhadhal
是的,没错,onSuccess()在离线时不会被触发,但不幸的是,使用addOnSuccessListener时,您无法重写onSuccess()方法以获取下载URL。这是有道理的,因为只有在从服务器获得响应(触发onSuccess)后,才能获取下载URL。只要任务未完成,就无法获取下载URL,对吧? - Alex Mamo
如果有其他可行的方法,请建议我。OK - ajay dhadhal
不,没有。只有在上传成功时,也就是服务器提供了URL时,您才能获取下载URL。当您离线且设备与服务器之间没有直接连接时,您无法获取URL。我可以帮您提供其他信息吗? - Alex Mamo

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