getDownloadUrl Firebase存储返回Null(Android)

时间:2018-04-22 15:17:16

标签: android firebase storage firebase-storage

我正在开发一个小项目,我有一些关于firebase存储和getDownloadUrl的问题。 我在FirebaseStorage上已经上传了一些图片,但是当我尝试下载Url时,它会返回空值。

这是代码: 进口:

import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;

函数getImage()

public void getImage(){
    StorageReference myStorage = FirebaseStorage.getInstance().getReference();
    StorageReference newStorage = myStorage.child("picture").child("pic_one.jpg");
    newStorage.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            myuri = uri;
        }
    });
}

没有任何身份验证的Firebase存储规则

service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
  allow read, write;   
    }
  }
}

当应用程序运行时,getDownloadUrl行没有做任何事情,我的意思是我想要检索https链接以使用滑行显示另一个活动中的图片,但我只是在myuri变量上得到null。 变量myuri定义为URI。

提前致谢。

1 个答案:

答案 0 :(得分:1)

尝试这样做

private String generatedFilePath;

 myStorage.child("picture").child("pic_one.jpg").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            // Got the download URL for 'pic_one.jpg'
            Uri downloadUri = taskSnapshot.getMetadata().getDownloadUrl();
            generatedFilePath = downloadUri.toString(); /// The string(file link) that you need
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });
  

也无法从root用户获取downloadURL   存储树。您应该存储该文件的downloadURL   以编程方式提供给您的数据库以便以后访问它,所以   首先将照片上传到您的存储,然后在onSuccess中上传   应该将downloadURL上传到您的数据库,然后从中检索它   有

为了做到这一点,你应该首先声明你的databaseReference

private DatabaseReference mDatabase;
// ...
mDatabase = FirebaseDatabase.getInstance().getReference();

然后,在您将图片成功上传到存储后,抓取downloadURL并将其发布到您的数据库

这是官方文档中的一个例子

    Uri file = Uri.fromFile(new File("path/to/images/rivers.jpg"));
    StorageReference riversRef = storageRef.child("images/"+file.getLastPathSegment());
    uploadTask = riversRef.putFile(file);

    // Register observers to listen for when the download is done or if it fails
    uploadTask.addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle unsuccessful uploads
        }
    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
            // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL.
            Uri downloadUrl = taskSnapshot.getDownloadUrl(); //After uploading your picture you can get the download url of it

mDatabase.child("images").setValue(downloadUrl); //and then you save it in your database

        }
    });

然后记得从这样的数据库中获取downloadURL

mDatabase.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    String downloadURL = dataSnapshot.getValue(String.class);
    //do whatever you want with the download url
  }

希望它有所帮助,快乐编码!