错误:类型不兼容:无法将Task <uri>转换为Uri

时间:2018-11-15 12:40:48

标签: android firebase firebase-storage

我想获取在Firebase中上传的图像的网址。要获取图像,我需要具有特定图像的Url。但是在获取过程中出现了问题。 “输出”框显示以下内容:

  

错误:类型不兼容:任务无法转换为Uri

如果我使用Task<Uri>,则图片网址会有所不同。与乌里相比。

  private void startPosting() {
    if (filePath != null) {
        final ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("Uploading...");
        progressDialog.show();

        final StorageReference ref = mStorage.child("Quote_Image" + UUID.randomUUID().toString());
        ref.putFile(filePath)
                .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {

                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        progressDialog.dismiss();
                        Toast.makeText(adminUpdateQuotesSend.this , "Uploaded" , Toast.LENGTH_SHORT).show();
                        mDatbase = FirebaseDatabase.getInstance().getReference().child("Quotes");
                        DatabaseReference newPost = mDatbase.push();
                        Uri down=ref.getDownloadUrl();
                            Uri dow=down;
                        newPost.child("ImageUrl").setValue(ref.getDownloadUrl());
                       // newPost.child("Positivity").setValue(PositiveDesc);
                    }
                })
                .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                        double progress = (100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot
                                .getTotalByteCount());
                        progressDialog.setMessage("Uploaded " + (int) progress + "%");

                    }
                });

    }
}

错误在以下代码行上闪烁:

Uri down=ref.getDownloadUrl();

2 个答案:

答案 0 :(得分:1)

您遇到以下错误:

  

不兼容的类型:无法将任务转换为Uri

因为ref.getDownloadUrl()返回一个Task对象,而不返回Uri对象。 Java中无法将Task对象转换为Uri对象。

要获取下载网址,您需要使用addOnSuccessListener,如以下代码行所示:

ref.putFile(filePath).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                String url = uri.toString();

                //Do what you need to do with url
            }
        });
    }
});

答案 1 :(得分:1)

请确保您是否使用任务检查isSuccessful()

要获取您要上传的文件的下载URL,应在这样的任务中运行该文件。

首先,我们做一个参考来存储您的文件,然后我们运行一个任务等待结果,如果结果为true,在这种情况下,我们返回文件的downloadUrl,然后当我们{{1} },这就是我们知道已经上传文件并具有URL的地方,然后我们再次检查上传过程是否正确完成,并使用

获取该文件的下载URL。

.addOnCompleteListener,因为它是一个URI,所以我们可以将该URL转换为类似Uri downloadUrl = task.getResult();或简单地String downloadUrl = task.getResult().toString();

的字符串
downloadUrl.toString();

唯一的是final StorageReference ref = mStorage.child("Quote_Image" + UUID.randomUUID().toString()); ref.putFile(filePath).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(); } }).addOnCompleteListener(new OnCompleteListener<Uri>() { @Override public void onComplete(@NonNull Task<Uri> task) { if (task.isSuccessful()) { progressDialog.dismiss(); Toast.makeText(adminUpdateQuotesSend.this , "Uploaded" , Toast.LENGTH_SHORT).show(); mDatbase = FirebaseDatabase.getInstance().getReference().child("Quotes"); DatabaseReference newPost = mDatbase.push(); Uri downloadUrl = task.getResult(); newPost.child("ImageUrl").setValue(downloadUrl.toString()); // newPost.child("Positivity").setValue(PositiveDesc); } else { Toast.makeText(mContext, "upload failed: " + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); 在这里不起作用。