如何从Firebase数据库检索图像URL?

时间:2018-11-05 13:43:14

标签: android firebase firebase-storage

我搜索了很多有关堆栈溢出的问题,寻找答案,但是没有一个对我有用。

我正在使用类似下面的代码将图像从用户的设备上传到Firebase存储,并与之一起使用上传的图像的URL更新Firebase中的imageURL节点。

private void uploadFile(Bitmap bitmap) {

        FirebaseStorage storage = FirebaseStorage.getInstance();
        final StorageReference storageRef = storage.getReference();

        final StorageReference ImagesRef = storageRef.child("images/"+mAu.getCurrentUser().getUid()+".jpg");


        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 20, baos);
        byte[] data = baos.toByteArray();
        UploadTask uploadTask = ImagesRef.putBytes(data);



        uploadTask.addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                Log.i("whatTheFuck:",exception.toString());
            }
        }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @RequiresApi(api = Build.VERSION_CODES.KITKAT)
            @Override
            public void onSuccess(final UploadTask.TaskSnapshot taskSnapshot) {
                // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.



                Task<Uri> downloadUrl = taskSnapshot.getMetadata().getReference().getDownloadUrl();

                DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users").child(mAu.getCurrentUser().getUid());

                Log.i("seeThisUrl", downloadUrl.toString());

                ref.child("imageURL").setValue(downloadUrl.toString());


            }
        });

但是imageURL始终不是我所期望的,它具有以下形式:

  

com.google.android.gms.tasks.zzu@51bc124

不是实际的URL,我无法找到为什么会这样的答案。

1 个答案:

答案 0 :(得分:0)

您正在打印:

com.google.android.gms.tasks.zzu@51bc124

因为这是downloadUrl对象的内存中的地址,该地址的类型为Task<Uri>不是实际的Uri。

根据有关如何get a download URL的官方文档:

  

上传文件后,您可以通过调用StorageReference上的getDownloadUrl()方法来获取下载文件的URL:

final StorageReference ref = storageRef.child("/* Your path */");
uploadTask = ref.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();
        }

        return ref.getDownloadUrl(); //Call the getDownloadUrl() method
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
        } else {
            // Handle failures
        }
    }
});

这是文档中的示例。