【问题标题】:Firebase Storage getDownloadUrl() method can't be resolvedFirebase 存储 getDownloadUrl() 方法无法解析
【发布时间】:2018-11-12 15:09:40
【问题描述】:

要将 图像 上传到 Firebase 存储,我将 addOnSuccessListener 附加到 StorageReference 的实例上。在覆盖onSuccess 方法时,我在taskSnapshot 的实例上调用getDownloadUrl(),但它给了我一个错误提示

无法解析方法 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);
            }
        });
    }
}

【问题讨论】:

  • 在完成相关问题后,我也尝试了@SuppressWarnings("VisibleForTests") Uri downloadUrl = taskSnapshot.getDownloadUrl();,但仍然遇到同样的错误。
  • 打印屏幕代码真是个糟糕的主意。
  • @JosefKorbel 它以红色显示getDownloadUrl(),这就是我添加它的原因。
  • 是的,但是我们无法复制和复制,没有人会从截图中重写它。
  • 最好将代码复制到问题中,而不是显示难以阅读且无法搜索的屏幕截图。

标签: android firebase firebase-storage


【解决方案1】:

Firebase API 有 changed

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

【讨论】:

  • 我在TaskSnapshot 的实例上调用了getDownloadUrl(),当时它正在返回Uri,但现在它正在返回Task&lt;Uri&gt;。过去几个月调用getDownloadUrl()方法的方法有变化吗?
  • 查看修改后的答案,它已于 2018 年 5 月 23 日弃用。所以是的,您现在必须通过 Task 对象获取 Uri。
  • @Daniel F 在onSuccess() 中我写了Task&lt;Uri&gt; downloadUri=taskSnapshot.getMetadata().getReference().getDownloadUrl(); Log.i("url:",downloadUri.getResult().toString()); 但它却是Exception 'java.lang.IllegalStateException: Task is not yet complete' 请帮忙
  • @userI downloadUri 是一个任务。你有两个选择。在调用downloadUri.getResult()之前调用Tasks.await(downloadUri)(但只有在后台线程中才这样做!!!),或者使用downloadUri.addOnCompleteListener(...),如developers.google.com/android/guides/tasks所示
  • @userI 我必须纠正一件事:如果你在后台线程中,你可以调用theUri = Tasks.await(downloadUri),因为downloadUri.getResult() 只在downloadUri.addOnCompleteListener(...) 内部调用。它也可以在Tasks.await(downloadUri) 之后调用,但没有必要这样做,因为await 已经在返回结果。
【解决方案2】:

你现在使用不会得到图片的下载地址

profileImageUrl = taskSnapshot.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
            // ...
        }
    }
});

【讨论】:

【解决方案3】:
final StorageReference filePath = mImageStore.child("profile_images").child("full_image").child(userId + ".jpg");
                filePath.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        //Bitmap hochladen
                        uploadBitMap(uri.toString());
                    }
                });

【讨论】:

    【解决方案4】:

    .getDownloadURL 不再可用且已弃用。 来自文档 Task&lt;Uri&gt;getdownloadUrl(); 异步检索具有可撤销令牌的长期下载 URL。 见documentation

     @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
         Task<Uri> urlTask = taskSnapshot.getStorage().getDownloadUrl(); 
        while (!urlTask.isSuccessful());
         Uri downloadUrl = urlTask.getResult();
    //continue with your code
    

    【讨论】:

      【解决方案5】:

      getDownloadUrl 方法已被弃用。而是使用以下 taskSnapshot.getMetadata().getReference().getDownloadUrl().toString()

      【讨论】:

        【解决方案6】:

        你应该试试这个。理解它并尝试在你的中实施

        buttonSetup.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String name = editText_name.getText().toString();
                    if (!TextUtils.isEmpty(name) && mainImageURI != null) {
                        final String user_id = firebaseAuth.getCurrentUser().getUid();
                        progressBar_setup.setVisibility(View.VISIBLE);
                        final StorageReference image_path = storageReference.child("profile_images").child(user_id + ".jpg");
                        UploadTask uploadTask = image_path.putFile(mainImageURI);
        
                        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 image_path.getDownloadUrl();
                            }
                        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                            @Override
                            public void onComplete(@NonNull Task<Uri> task) {
                                if (task.isSuccessful()){
                                    Uri downloadUrl = task.getResult();
                                    Log.i("The URL : ", downloadUrl.toString());
                                }
                            }
                        });
                    }
                }
            });
        

        【讨论】:

          【解决方案7】:

          试试

          {
              firebase.storage()
              .child()
              .getDownloadURL().then()
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-12-05
            • 1970-01-01
            • 2019-11-18
            • 2021-04-06
            相关资源
            最近更新 更多