我在我的android项目中使用了Glide 4.6.1和Firebase 11.8.0。我将所有内容与Firebase相关联。
我想使用Glide从Firebase存储中加载图像。在Firebase文档中,它们显示了以下示例:
Glide.with(this /* context */)
.using(new FirebaseImageLoader())
.load(storageReference)
.into(imageView);
但这不起作用,因为Glide 4.x不支持.using()方法。
我的目标是:
StorageReference imageRef = storage.getReference().child("task1.png");
Glide.with(this).load(imageRef).into(ImageView);
但是imageRef
是这样的:gs://bucket/images/stars.jpg
Glide无法从此链接加载。所以我尝试了这个:
StorageReference imageRef = storage.getReferenceFromURL("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");
但是Firebase将http链接“转换”为gs,这再次无效。
所以我用Google搜索了问题,我发现了这个解决方案:
storageRef.child("task1.png").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
String imageRef = uri.ToString();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle any errors
}
});
Glide.with(this).load(imageRef).into(ImageView);
但uri
不是图像的直接下载链接。
因此,我能想到的唯一解决方案是直接在字符串中使用给出http链接,并在Glide的.load()方法中使用它,这不是我的目标。我需要从存储引用中获取直接链接以与Glide一起使用。
这对我有用:
将onCompleteListener添加到您的引用中
如果任务成功,则从task.getResult()获取链接
但我不确定这是不是最好的方式,GoodLuck!
storageReference = storage.getReference().child("images/").child(user.getUid());
storageReference.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if(task.isSuccessful())
{
Glide.with(MainActivity.this)
.load(task.getResult())
.apply(RequestOptions.circleCropTransform())
.into(ivProfile);
}
else {
Toast.makeText(MainActivity.this, task.getException().getMessage(), Toast.LENGTH_SHORT).show();
Log.d("Firebase id",user.getUid());
}
}
});