【发布时间】:2017-05-18 11:42:46
【问题描述】:
我尝试从应用程序的图库中获取图像并将其放入 ImageView,但出现错误“OutOfMemoryError”
FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:695)
at kz.app.discount.activities.AddingProduct.onActivityResult(AddingProduct.java:374)
at android.app.Activity.dispatchActivityResult(Activity.java:5456)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3402)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3449)
at android.app.ActivityThread.access$1200(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1328)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5279)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)`
使用 Intent.ACTION_PICK 和 onActivityResult() 从图库中获取图像的代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
Bitmap bitmap = null;
ImageView imageView = iVAddProductDiscountPicture;
switch (requestCode) {
case GALLERY_REQUEST:
if (resultCode == RESULT_OK) {
Uri selectedImage = imageReturnedIntent.getData();
try {
bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), selectedImage);
final ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 10, stream);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(stream.toByteArray()));
//TODO: дописать код сжатия изображения
imageView.setImageBitmap(decoded);
} catch (IOException e) {
e.printStackTrace();
}
alertDialog.dismiss();
}
}
}
【问题讨论】:
-
OutOfMemoryError表示图像太大,您的设备无法处理。加载它已经缩放。 -
@MichaelDodd,文件大小无关紧要,只有分辨率才重要。
-
@Wladimir Rudnicky 请将位图压缩大小从 10 增加到 100 并尝试 bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
-
如果你摆脱完全没有意义的
ByteArrayOutputStream,重新编码,重新解码图像,你会有更好的运气。您所做的只是浪费堆空间并降低图像质量。然而,即便如此,根据图像分辨率和堆的状态,您可能没有足够的堆空间。
标签: android imageview bitmapfactory