【发布时间】: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