Android 如何从firebase存储下载特定大小的图像

Android 如何从firebase存储下载特定大小的图像,android,firebase,firebase-storage,android-glide,Android,Firebase,Firebase Storage,Android Glide,我在android应用程序中使用firebase存储来存储用户上传的图像上传的所有图像均为方形。 我发现下载这些图像会消耗大量用户带宽,我想通过减小下载到方形imageview中的图像的大小来减少这种消耗 我正在使用Glide下载此图像,我尝试下载自定义大小的图像,但图像未显示在imageview上 接口 public interface MyDataModel { public String buildUrl(int width, int height); } public class

我在android应用程序中使用firebase存储来存储用户上传的图像上传的所有图像均为方形。 我发现下载这些图像会消耗大量用户带宽,我想通过减小下载到方形imageview中的图像的大小来减少这种消耗

我正在使用Glide下载此图像,我尝试下载自定义大小的图像,但图像未显示在imageview上

接口

public interface MyDataModel {
  public String buildUrl(int width, int height);
}
public class CustomImageSize implements MyDataModel {

  private String uri;

  public CustomImageSize(String uri){
    this.uri = uri;
  }

  @Override
  public String buildUrl(int width, int height) {

    return uri + "?w=" + width + "&h=" + height;
  }
}
扩展BaseGlideUrlLoader的我的类

public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
  public MyUrlLoader(Context context) {
    super(context);
  }

  @Override
  protected String getUrl(MyDataModel model, int width, int height) {
    // Construct the url for the correct size here.
    return model.buildUrl(width, height);
  }
}
    // Reference to an image file in Firebase Storage
StorageReference storageReference = ...;

ImageView imageView = ...;

// Load the image using Glide
Glide.with(this /* context */)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .into(imageView);
最后

CustomImageSize size = new CustomImageSize(uri);

  Glide.with(context)
    .using(new MyUrlLoader(context))
    .load(size)
    .centerCrop()
    .priority(Priority.HIGH)
    .into(imageView);
上述解决方案的结果

图像未出现在我的方形图像视图中

解决方案2:使用firebase图像加载器

public class MyUrlLoader extends BaseGlideUrlLoader<MyDataModel> {
  public MyUrlLoader(Context context) {
    super(context);
  }

  @Override
  protected String getUrl(MyDataModel model, int width, int height) {
    // Construct the url for the correct size here.
    return model.buildUrl(width, height);
  }
}
    // Reference to an image file in Firebase Storage
StorageReference storageReference = ...;

ImageView imageView = ...;

// Load the image using Glide
Glide.with(this /* context */)
        .using(new FirebaseImageLoader())
        .load(storageReference)
        .into(imageView);
上述解决方案2的结果

工作!图像正在出现,但就像下载了整个图像一样,占用了大量带宽。我只想一个自定义大小的图像,例如200px的200px被下载

如何在上面的解决方案1中执行或更改从firebase存储下载自定义大小的图像

编辑

我已尝试访问我的一幅图像
https://firebasestorage.googleapis.com/....m.png
,并成功将其加载到网页。但是当我尝试将特定于大小的参数添加到我的图像url链接
https://firebasestorage.googleapis.com/....m.png?w=100&h=100
网页上出现错误

 {
  "error": {
    "code": 403,
    "message": "Permission denied. Could not perform this operation"
  }
}

尝试使用以下命令下载图像:-

StorageReference islandRef = storageRef.child("yourImage.jpg");
    // defines the specific size of your image
    final long ONE_MEGABYTE = 1024 * 1024;
    islandRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
        @Override
        public void onSuccess(byte[] bytes) {
            // Data for "yourImage.jpg" is returns, use this as needed
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle any errors
        }
    });
StorageReference islandRef=storageRef.child(“yourmage.jpg”);
//定义图像的特定大小
最终长1兆字节=1024*1024;
islandRef.getBytes(1兆字节).addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共void(字节[]字节){
//“yourImage.jpg”的数据是返回值,根据需要使用它
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常){
//处理任何错误
}
});

我终于能够使用
MyUrlLoader
类从firebase存储下载图像

你看,firebase存储URL是这样的

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX
    public class CustomImageSize implements MyDataModel {

  private String uri;

  public CustomImageSize(String uri){
    this.uri = uri;
  }

  @Override
  public String buildUrl(int width, int height) {

    return uri + "w=" + width + "&h=" + height;
  }
}
正如您在上面看到的,该链接已经有了这个特殊的问号字符
,它代表查询字符串的开始,因此当我使用
CustomImageSize
类时,添加了另一个
,因此该链接以两个
结束,导致下载失败

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX?w=200&h=200
解决方案是删除我的
CustomImageSize
类中的
。结果是这样的

firebasestorage.googleapis.com/XXXX.appspot.com/Folder%2Image.png?&alt=media&token=XXX
    public class CustomImageSize implements MyDataModel {

  private String uri;

  public CustomImageSize(String uri){
    this.uri = uri;
  }

  @Override
  public String buildUrl(int width, int height) {

    return uri + "w=" + width + "&h=" + height;
  }
}

虽然下载了,但我不确定是下载了整个图像还是仅下载了自定义大小的图像。这是因为,在更正了导致查看失败的错误后,我试图在浏览器中访问图像,但仍然我收到了一张完整的图像。没有调整大小的图像(w=200&h=200)

这很好,但效率不高,
OutOfMemoryError
可能引发应用程序冲突。我想使用Glide高效地加载自定义大小的图像,但可以根据您的要求使用更少的值来代替1兆字节的1024*1024常量。我不知道您可以通过传递“w”和“h”GET请求,在Firebase存储中请求上传图像的特定大小。您能否分享提到此功能的文档或文章?我在官方文档中找不到。@Wilik找到解决方案了吗?我想你只能下载你上传的资源。如果您担心带宽,您可以按照云函数示例创建缩略图,并根据您的大小需要进行修改。