为啥这不能检索 Firebase 存储上图像的下载 URL?

Posted

技术标签:

【中文标题】为啥这不能检索 Firebase 存储上图像的下载 URL?【英文标题】:Why can't this retieve the download URL of an image on Firebase Storage?为什么这不能检索 Firebase 存储上图像的下载 URL? 【发布时间】:2021-09-15 09:19:53 【问题描述】:

我正在尝试通过获取我想要在 putImage 调用的 onSuccessListener 中检索的图像的下载 url 从 android 应用程序的 Firebase 存储中检索图像,我首先用于上传图像。我将下载 URL 保存在字段变量中,但问题是字段变量未更新。在我尝试将其设置为等于我要检索的图像的下载 URl 之后,我使用 toast 打印出 url 字段变量的值,但它保持不变。我不确定为什么会出现这种情况,所以如果能帮助我解决这个问题,我将不胜感激。

//field variable that s meant to hold download url for the image I want to retrieve
String url = "never changed"

...

final String imageKey = UUID.randomUUID().toString();
        StorageReference profileref = storageReference.child("contactProfiles/" + imageKey);
        profileref.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() 
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) 
                Task<Uri> task = taskSnapshot.getMetadata().getReference().getDownloadUrl();
                task.addOnSuccessListener(new OnSuccessListener<Uri>() 
                    @Override
                    public void onSuccess(Uri uri) 
                        //setting url equal to url of the image I want to retrieve 
                        url = uri.toString();
                    
                );
                Toast.makeText(ContactCreation.this, "Successful Profile Picture Upload", Toast.LENGTH_SHORT).show();
            
        )
         .addOnFailureListener(new OnFailureListener() 
             @Override
             public void onFailure(@NonNull Exception e) 
                 Toast.makeText(ContactCreation.this, "Failed to Upload Profile Picture", Toast.LENGTH_SHORT).show();
             
         );

  //Seeing if the url changed or not
        Toast.makeText(ContactCreation.this, url, Toast.LENGTH_SHORT).show();

【问题讨论】:

请仅使用android-studio 标签来回答有关 Android Studio IDE 本身的问题。对于一般的 Android 编程问题,请使用android 标签。 【参考方案1】:

getDownloadURL 的调用会调用服务器,因此是异步执行的。这意味着现在在您的代码中,Toast.makeText(ContactCreation.this, urlurl = uri.toString() 运行之前运行,这就解释了为什么它没有记录任何值。

解决方案总是一样的:任何需要该值的代码,都需要在使用该值调用的onSuccess 内,或者需要从那里调用。

所以:

task.addOnSuccessListener(new OnSuccessListener<Uri>() 
    @Override
    public void onSuccess(Uri uri) 
        url = uri.toString();
        Toast.makeText(ContactCreation.this, url, Toast.LENGTH_SHORT).show();
    
);

如果您不熟悉这种异步行为,我建议您阅读更多关于它的内容。例如:

URL generated by Firebase Storage does not allow access to the file,它显示了Task 侦听器的一些链接。 How to get the download url from Firebase Storage? Hello, I have problem to upload my image to my firebase storage

【讨论】:

谢谢!我没有意识到它是异步的哈哈。我也感谢您链接其他资源。

以上是关于为啥这不能检索 Firebase 存储上图像的下载 URL?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Firebase 存储中检索图像预览?

为啥无法使用 Google Firebase 存储中的下载 URL 打开上传的文件?

使用 Angular 7 从 Firebase 存储中检索图像

Angularfire2:如何从 Firebase 存储中检索文件内容

Firebase 存储异步图像下载随机顺序

为啥在 Vue js 中尝试从 firebase 检索令牌时出现错误?