Firebase存储getDownloadUrl()方法无法解析

Nee*_*ani 7 android firebase firebase-storage

要将图像上传到Firebase存储,我将附加addOnSuccessListenerStorageReference的实例上.虽然重写onSuccess方法我正在调用getDownloadUrl()实例,taskSnapshot但它给了我一个错误说

无法解析方法getDownloadUrl()

我在2个月前创建的这个应用程序,此应用程序运行良好,getDownloadUrl()工作正常.另外,在taskSnapshot我按Ctrl +空格的情况下,在建议中我找不到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);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*l F 22

Firebase API已更改.

2018年5月23日

云存储版本16.0.1

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

UploadTask.TaskSnapshot有一个命名的方法getMetadata()返回一个StorageMetadata对象.

StorageMetadata对象包含一个getReference()返回StorageReference对象的命名方法.

StorageReference对象包含该getDownloadUrl()方法,该方法现在返回Task对象而不是Uri对象.

然后必须听取该任务以获得Uri,这可以异步地或以阻塞方式完成; 请参阅Tasks API.

  • @userI downloadUri 是一个任务。你有两个选择。要么在调用 `downloadUri.getResult()` 之前调用 `Tasks.await(downloadUri)`(但只有在后台线程时才这样做!!!),或者使用 `downloadUri.addOnCompleteListener(...)` 作为显示在 https://developers.google.com/android/guides/tasks (2认同)
  • @userI我必须纠正一件事:如果你在后台线程,你可以调用`theUri = Tasks.await(downloadUri)`因为`downloadUri.getResult()`只在`downloadUri.addOnCompleteListener(...)里面调用`.它也可能在`Tasks.await(downloadUri)`之后被调用,但是由于`await`已经返回结果,所以不需要这样做. (2认同)

小智 6

你现在不会得到图像的下载 url 使用

profileImageUrl = 任务快照。getDownloadUrl (). toString (); 此方法已弃用。

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

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
            // ...
        }
    }
});
Run Code Online (Sandbox Code Playgroud)