Firebase Storage中的getDownloadUrl()方法无法解析

9
为了将图片上传到Firebase Storage,我在StorageReference实例上附加了addOnSuccessListener。在覆盖onSuccess方法时,我调用了taskSnapshot实例上的getDownloadUrl(),但是它给出了一个错误,说“无法解析方法getDownloadUrl()”。
这个应用程序我2个月前创建的,早期这个应用程序工作得很好,getDownloadUrl()也很好用。此外,在taskSnapshot实例中,当我按Ctrl + space时,在建议中找不到getDownloadUrl()方法。为什么会发生这种情况?
onActivityResult()的代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == RC_SIGN_IN) {
        if (resultCode == RESULT_OK) {
            Toast.makeText(this, "Signed in!!!1", Toast.LENGTH_SHORT).show();
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "Failed to sign in", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
    else if(requestCode == RC_PHOTO_PICKER && resultCode == RESULT_OK){
        Uri selectedPhoto = data.getData();

        StorageReference localRefrence = storageReference.child(selectedPhoto.getLastPathSegment());

        //  Uploading the file on the storage
        localRefrence.putFile(selectedPhoto).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                 Uri downloadUrl = taskSnapshot.getDownloadUrl();

                FriendlyMessage message = new FriendlyMessage(mUsername, null, downloadUrl.toString());
                databaseReference.push().setValue(message);
            }
        });
    }
}

1
在查看了相关问题后,我也尝试了 @SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl(); 但仍然出现相同的错误。 - Neeraj Sewani
2
将代码截图是一个非常糟糕的想法。 - Josef Korbel
1
@JosefKorbel 这是因为 getDownloadUrl() 显示为红色,所以我添加了它。 - Neeraj Sewani
1
是的,但我们无法复制和复制,没有人会从截图中重新编写它。 - Josef Korbel
1
最好将您的代码复制到问题中,而不是显示一个难以阅读且无法搜索的截图。 - Doug Stevenson
显示剩余2条评论
7个回答

24

Firebase API发生了变化

2018年5月23日

Cloud Storage版本16.0.1

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

UploadTask.TaskSnapshot有一个名为getMetadata()的方法,它返回一个StorageMetadata对象。

这个StorageMetadata对象包含了一个名为getReference()的方法,该方法返回一个StorageReference对象。

那个包含StorageReference对象,现在包含了返回Task对象而不是Uri对象的方法getDownloadUrl()

为了获取Uri,必须监听此Task以进行异步或阻塞方式的处理;请查看Tasks API


1
我曾在“TaskSnapshot”的实例上调用了“getDownloadUrl()”,当时它返回的是“Uri”,但现在它返回的是“Task<Uri>”。在过去的几个月中,“getDownloadUrl()”方法的调用方式发生了改变吗? - Neeraj Sewani
1
请查看修改后的答案,它已于2018年5月23日被弃用。因此,现在您必须通过Task对象获取Uri。 - Daniel F
1
@Daniel F 在 onSuccess() 中,我写了以下代码:Task<Uri> downloadUri=taskSnapshot.getMetadata().getReference().getDownloadUrl(); Log.i("url:",downloadUri.getResult().toString()); 但是它抛出了异常 'java.lang.IllegalStateException: Task is not yet complete'。请帮忙解决。 - Bhagyashri
2
@userI,downloadUri 是一个 Task。你有两个选择。如果你在后台线程中,请调用 Tasks.await(downloadUri),然后再调用 downloadUri.getResult();或者按照 https://developers.google.com/android/guides/tasks 中所示使用 downloadUri.addOnCompleteListener(...) - Daniel F
3
@userI 我需要纠正一件事:如果你在后台线程中,你可以调用theUri = Tasks.await(downloadUri)因为downloadUri.getResult()仅在downloadUri.addOnCompleteListener(...)内被调用。它可能也会在Tasks.await(downloadUri)之后被调用,但没有必要这样做,因为await已经返回了结果。 - Daniel F
@Daniel F 它起作用了。非常感谢您的快速帮助。 - Bhagyashri

6

您现在无法使用

profileImageUrl = taskSnapshot.getDownloadUrl().toString(); 获取图像的下载URL,因为该方法已经过时。

相反,您可以使用以下方法:

uniqueId = UUID.randomUUID().toString();
ur_firebase_reference = storageReference.child("user_photos/" + uniqueId);

Uri file = Uri.fromFile(new File(mphotofile.getAbsolutePath()));
UploadTask uploadTask = ur_firebase_reference.putFile(file);

Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
    @Override
    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
        if (!task.isSuccessful()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return ur_firebase_reference.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
            System.out.println("Upload " + downloadUri);
            Toast.makeText(mActivity, "Successfully uploaded", Toast.LENGTH_SHORT).show();
            if (downloadUri != null) {

                String photoStringLink = downloadUri.toString(); //YOU WILL GET THE DOWNLOAD URL HERE !!!!
                System.out.println("Upload " + photoStringLink);

            }

        } else {
            // Handle failures
            // ...
        }
    }
});

谢谢,这个完美地解决了我的问题。我不知道为什么你的答案还没有得到足够的评价。类似的解决方案可以在 LucaUburti 的帖子中找到,链接如下:firebase-storage-getDownloadUrl 解决方案链接 - Brian

4
final StorageReference filePath = mImageStore.child("profile_images").child("full_image").child(userId + ".jpg");
                filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        //Bitmap hochladen
                        uploadBitMap(uri.toString());
                    }
                });

1

getDownloadUrl方法已经被弃用。请使用以下代码:taskSnapshot.getMetadata().getReference().getDownloadUrl().toString()


1
.getDownloadURL 方法已不再提供并已弃用。 从文档中可以看到 Task<Uri>getdownloadUrl(); 异步检索具有可撤销令牌的长期下载 URL。 请参见 documentation
 @Override 
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
     Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl(); 
    while (!urlTask.isSuccessful());
     Uri downloadUrl = urlTask.getResult();
//continue with your code

0

你应该尝试这个。理解它并尝试在你的项目中实现。

buttonSetup.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String name = editText_name.getText().toString();
            if (!TextUtils.isEmpty(name) && mainImageURI != null) {
                final String user_id = firebaseAuth.getCurrentUser().getUid();
                progressBar_setup.setVisibility(View.VISIBLE);
                final StorageReference image_path = storageReference.child("profile_images").child(user_id + ".jpg");
                UploadTask uploadTask = image_path.putFile(mainImageURI);

                uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
                    @Override
                    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                        if(!task.isSuccessful()){
                            throw task.getException();
                        }
                        return image_path.getDownloadUrl();
                    }
                }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                    @Override
                    public void onComplete(@NonNull Task<Uri> task) {
                        if (task.isSuccessful()){
                            Uri downloadUrl = task.getResult();
                            Log.i("The URL : ", downloadUrl.toString());
                        }
                    }
                });
            }
        }
    });

0

尝试

{
    firebase.storage()
    .child()
    .getDownloadURL().then()
}

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