Firebase 存储 getDownloadUrl() 方法无法解析
Posted
技术标签:
【中文标题】Firebase 存储 getDownloadUrl() 方法无法解析【英文标题】:Firebase Storage getDownloadUrl() method can't be resolved 【发布时间】: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()
,这就是我添加它的原因。
是的,但是我们无法复制和复制,没有人会从截图中重写它。
最好将代码复制到问题中,而不是显示难以阅读且无法搜索的屏幕截图。
【参考方案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<Uri>
。过去几个月调用getDownloadUrl()
方法的方法有变化吗?
查看修改后的答案,它已于 2018 年 5 月 23 日弃用。所以是的,您现在必须通过 Task 对象获取 Uri。
@Daniel F 在onSuccess()
中我写了Task<Uri> 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
// ...
);
【讨论】:
谢谢,这很完美,我不知道为什么你的回答仍然被低估。 LucaUburti 在他的帖子中可以通过以下链接在 github 上找到类似的解决方案:firebase-storage-getDownloadUrl solution link【参考方案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<Uri>
和 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()
【讨论】:
以上是关于Firebase 存储 getDownloadUrl() 方法无法解析的主要内容,如果未能解决你的问题,请参考以下文章
Android Glide 和 Firebase 存储:将连续图像从 Firebase 存储加载到 Imageview - 闪烁