如何找到在Android中不会触发OutOfMemoryException的图片大小?

时间:2018-12-15 01:12:49

标签: android memory-management android-bitmap

我的应用程序使用设备相机拍摄图像,然后将其打开,以便用户执行一些处理。为此,我检查图像方向并在必要时旋转它,就像这样:

       Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), lastTaken);
        int rotation = getCameraPhotoOrientation(filePath);
        if (0 < rotation)
        {
            Matrix mx = new Matrix();
            mx.setRotate((float) rotation);
            image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), mx, true);
        }

此代码可在大多数设备上使用,但是在我使用的一个较旧的测试设备上,当旋转图像时会导致OutOfMemoryException,这可能是因为它试图将图像的两个副本保存在其中。记忆。

如何避免这种情况?

如果在此过程中没有简便的方法可以防止出现此问题,那么有没有一种方法可以测试我有多少可用内存,并将相机使用的图像分辨率限制为可以留下足够的图像分辨率这个手术的空间?我已经在指定分辨率,所以这实际上是一个问题,即如何比较图像大小和可用内存以确定哪种分辨率是安全的。我的一个约束是,用户所做的更改必须在原始图像上进行,因此编辑图像的较小副本将不会剪切该图像,除非有一种简便的方法可以将这些更改反映在存储的版本上。因此,将图像缩小到可以在内存中支持的大小绝不是什么灾难。

2 个答案:

答案 0 :(得分:1)

图像的大小是多少?您是否在应用程序中检查了可能的内存泄漏?

无论如何,一种方法是,您可以在创建新的第二个位图内容之后尝试重用分配给第一个位图的内存。 根据此处的Android文档-https://developer.android.com/topic/performance/graphics/manage-memory

  

Android 3.0(API级别11)引入了   BitmapFactory.Options.inBitmap字段。如果设置了此选项,则解码   使用Options对象的方法将尝试重用现有的方法   加载内容时的位图。这意味着位图的内存是   重用,从而提高性能,并删除两个内存   分配和取消分配。

您可以将位图图像设置为在创建新的位图时回收。

答案 1 :(得分:0)

我找不到解决可用内存量以及需要多少内存的方法,但是在找到关于该主题的some other questions之后,我发现最好的解决方案是启用{{ application manifest中的1}}元素为我解决了崩溃问题,尽管它没有回答问题,并且在进一步阅读后,我怀疑目前情况尚无令人满意的方法。