【问题标题】:How to get Firebase Storage image URL in android studio?如何在 android studio 中获取 Firebase 存储图像 URL?
【发布时间】:2018-09-10 02:15:32
【问题描述】:

我想在 Firebase Storage 的 imageView 上显示图像而不将图片保存在设备中,所以我尝试使用突出显示的 URL(来自下图)并且它有效,但我不想写地址手动。 如何使用代码获取地址? p.s 我尝试了 dataBaseStorageRef.getDownloadUrl(),它给了我另一个 URL,而不是图片中的那个。

enter image description here

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    final StorageReference filePath = storage.child("books").child(""+AddBook.book_id+1).child("photo.jpg");
    if(requestCode == RESULT_GALLERY){
        if (resultCode == RESULT_OK){
            pic_uri = data.getData();
            book_img.setImageURI(pic_uri);
            filePath.putFile(pic_uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    Toast.makeText(AddBookActivity.this, "Upload done", Toast.LENGTH_SHORT).show();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(AddBookActivity.this, "Failed to upload!", Toast.LENGTH_SHORT).show();

                }
            });
            img_addr = filePath.getDownloadUrl().toString();


            Toast.makeText(this, "picture was selected", Toast.LENGTH_SHORT).show();
        }
    }
}

然后,我正在尝试显示来自另一个活动的 img_addr 的图片 它不起作用,因为 image_addr 的地址不好(如果我手动将 img_addr 替换为附加链接中的地址它可以工作)

    if(books_list.get(i).img_addr!=null){
        Toast.makeText(v.getContext(),books_list.get(i).img_addr,Toast.LENGTH_LONG).show();

        Picasso.with(v.getContext()).load(books_list.get(i).img_addr).resize(50,50).into(img);

    }

感谢帮助的人

【问题讨论】:

  • 你能提供你试过的代码和你的数据库截图吗?

标签: android firebase firebase-storage


【解决方案1】:

您可以使用continueWithTask方法返回下载地址

如下:

final UploadTask uploadTask = filepath.putFile(uri);   
uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                    @Override
                                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                                        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 filepath.getDownloadUrl();

                                            }
                                        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Uri> task) {
                                                if (task.isSuccessful()) {
                                                    thumb_download_url = task.getResult().toString();


                                                }
                                            }
                                        });

                                    }
                                }).addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                    }
                                });

【讨论】:

  • getDownloadUrl 的 URL 地址对我不起作用。我已经添加了我的代码,请检查
  • 使用我提供的代码。 continueWithTask 将帮助您在上传完成后返回 url。你的代码错了!这个img_addr = filePath.getDownloadUrl().toString(); 应该在oncompleteListener 里面。使用我提供的代码。就我而言,下载的网址是thumb_download_url = task.getResult().toString();。重命名为img_addr就行了
【解决方案2】:

通过向其添加 onsuccess 和 onfailure 侦听器使 getDownloadUrl() 异步。

您的完整图片上传任务应如下所示

 photoReference.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {

                photoReference.getDownloadUrl().addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                       //do something
                    }
                }).addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        //get your image uri here
                        Uri imgUrl = uri;
                        String imgStringUrl = imgUrl.toString();
                    }
                });

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
               // do something
            }
        });

【讨论】:

  • 和你做的不一样。
  • 向 filePath.getDownloadUrl() 添加成功侦听器,并从侦听器中检索 url,就像在我的代码中一样。您的调用是同步的,不能保证会立即检索到该 url。这就是为什么调用应该是异步的。从成功监听器获取下载地址
【解决方案3】:

您可以通过以下方法获取下载地址:

private void uploadToStorage(String imgPath, String fileName) {

    Uri file = Uri.fromFile(new File(imgPath));
    StorageReference storageReference = mStorageRef.child(userId + "/images/" + fileName);

    storageReference.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            Task<Uri> downloadUrl = taskSnapshot.getStorage().getDownloadUrl();
            downloadUrl.addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    Log.v(TAG, "Media is uploaded");

                    String downloadURL = "https://" + task.getResult().getEncodedAuthority() 
                            + task.getResult().getEncodedPath() 
                            + "?alt=media&token=" 
                            + task.getResult().getQueryParameters("token").get(0);

                    Log.v(TAG, "downloadURL: " + downloadURL);
                    //save your downloadURL
                }
            });
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            Log.v(TAG, "Media is not uploaded");
            Log.v(TAG, "Exception: " + exception.getLocalizedMessage());
        }
    });
}

您还可以从task.getResult()下的方法中获取方案名称和查询

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2021-02-27
    • 2016-11-20
    • 1970-01-01
    • 2017-08-10
    • 2017-04-13
    • 1970-01-01
    相关资源
    最近更新 更多