Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android中找到不会触发OutOfMemoryException的图像大小?_Android_Memory Management_Android Bitmap - Fatal编程技术网

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

如何在Android中找到不会触发OutOfMemoryException的图像大小?,android,memory-management,android-bitmap,Android,Memory Management,Android Bitmap,我的应用程序使用设备摄像头拍摄图像,然后将其打开,以便用户可以执行一些处理。为此,我检查图像方向,如有必要,旋转图像,如下所示: Bitmap image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), lastTaken); int rotation = getCameraPhotoOrientation(filePath); if (0 < rotation)

我的应用程序使用设备摄像头拍摄图像,然后将其打开,以便用户可以执行一些处理。为此,我检查图像方向,如有必要,旋转图像,如下所示:

       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);
        }
Bitmap image=MediaStore.Images.Media.getBitmap(this.getContentResolver(),lastTake);
int rotation=getCameraPhotoOrientation(文件路径);
如果(0<旋转)
{
矩阵mx=新矩阵();
mx.setRotate((浮动)旋转);
image=Bitmap.createBitmap(image,0,0,image.getWidth(),image.getHeight(),mx,true);
}
此代码适用于大多数设备,但是在我一直使用的一个较旧的测试设备上,当图像旋转时,它会导致
OutOfMemoryException
,可能是因为它试图在内存中保存图像的两个副本

我怎样才能避免这种情况


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

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

无论如何,一种方法是,在创建新的第二个位图内容后,可以尝试重用分配给第一个位图的内存。 根据这里的Android文档-

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


您可以将位图图像设置为在创建新位图时循环使用

我找不到一种方法来计算可用的内存量和需要的内存量,但在找到这个主题后,我发现对我来说最好的解决方案是启用-中的
largeHeap
元素,这为我解决了崩溃问题,尽管它没有回答问题,而且在进一步阅读之后,我怀疑目前还没有令人满意的方法来解决这个问题。

请看,这部分内容是相当独立的,并且问题不会出现在任何其他设备上,因此我认为这只是图像大小与内存的函数,这是inBitmap选项的一个非常好的提示。