【问题标题】:android: uploading a picture to firebase after reducing the size to avoid out of memory errorandroid:减小大小后将图片上传到firebase以避免内存不足错误
【发布时间】:2018-09-14 01:50:32
【问题描述】:

我正在尝试将图片上传到 Firebase,但是当图片尺寸较大时,会出现 OOM 错误。我尝试使用一些库,例如 glide,但大小并没有减小。

以下是将 URI 更改为位图的代码:

public byte[] getBytesFromUri(Uri uri, int quality) {
    ByteArrayOutputStream stream=new ByteArrayOutputStream();
    Bitmap bitmap=null;
    try {   
        bitmap=MediaStore.Images.Media.getBitmap(this.getContentResolver(),uri);
    } catch (IOException e) {
        e.printStackTrace();
    }
    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);
    return stream.toByteArray();
}

这是上传到 firebase 部分:

StorageReference file2path=mStorage.child("products_images").child(mAuth.getCurrentUser().getUid()).child(nouveau_produit.getKey()).child("image_2");
file2path.putBytes(getBytesFromUri(resultUri2, 100)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
        Uri second_Dwn_Url=taskSnapshot.getDownloadUrl();
        image2=second_Dwn_Url.toString().trim();

        //images upload
        nouveau_produit.child("image_2").setValue(image2);
        nouveau_produit_category.child("image_2").setValue(image2);
    }
}).addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        Toast.makeText(UploadActivity.this,"uploading of second image failed",Toast.LENGTH_LONG).show();
    }
});

看来我上传的图片很大。 这是我在应用崩溃时遇到的错误:

FATAL EXCEPTION: main
Process: tk.a45developer.www.kukaguriro, PID: 13149
java.lang.OutOfMemoryError
    at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)
    at tk.a45developer.www.kukaguriro.UploadActivity.getBytesFromUri(UploadActivity.java:1294)
    at tk.a45developer.www.kukaguriro.UploadActivity$10.onClick(UploadActivity.java:867)
    at android.view.View.performClick(View.java:4508)
    at android.view.View$PerformClick.run(View.java:18675)
    at android.os.Handler.handleCallback(Handler.java:733)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5590)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1280)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1096)
    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你能发布你的代码或错误吗?
  • 来自文档Because putBytes() accepts a byte[], it requires your app to hold the entire contents of a file in memory at once. Consider using putStream() or putFile() to use less memory.
  • @tyczj 正在上传字节,所以当我更改为 putStream() 或 putFile() 时出现错误,因为我正在以字节的形式上传图像
  • 您的问题是“如何将大图像保存在 Firebase 存储中?”“如何减小图像的大小?” ???

标签: android firebase bitmap uri


【解决方案1】:

感谢你们的 cmets 我刚刚找到了一种使用 SiliCompressor 库的方法 这是我的代码,我使用 sillycompressor 库 sillycompressor github link 将 uri 更改为位图

public byte[] getBytesFromUri(Uri uri, int quality) {

    ByteArrayOutputStream stream=new ByteArrayOutputStream();
    Bitmap bitmap=null;
    try {
        bitmap = SiliCompressor.with(UploadActivity.this).getCompressBitmap(uri.toString());
    } catch (IOException e) {
        e.printStackTrace();
    }

    bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream);
    return stream.toByteArray();
}

【讨论】:

  • 制作中间位图还是个坏主意。该位图只是限制可以上传的文件的大小。如果您只是上传该文件,您将永远不会收到 oom,您可以上传任何文件。不仅仅是图片。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 2010-10-28
相关资源
最近更新 更多