可能重复:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget - Android
我的应用程序想要分配2529792个字节,我在128mb Ram的设备上运行它并且工作正常,然后我在htc上使用292mb的Ram空闲内存运行ir并且它给出了错误
01-14 21:08:27.972:E / GraphicsJNI(26585):VM不会让我们分配2529792个字节
这是我的LogCat输出
01-14 21:08:27.391: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process.
01-14 21:08:27.411: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=14425KB, Bitmap Size=14641KB, Limit=32768KB
01-14 21:08:27.411: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=668KB
01-14 21:08:27.512: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes
01-14 21:08:27.512: D/dalvikvm(26585): GC_FOR_MALLOC freed 905K, 24% free 13520K/17735K, external 14641K/16689K, paused 93ms
01-14 21:08:27.652: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 3K, 24% free 13552K/17735K, external 14641K/16689K, paused 116ms
01-14 21:08:27.662: D/skia(26585): --- decoder->decode returned false
01-14 21:08:27.792: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 13K, 24% free 13655K/17735K, external 14641K/16689K, paused 109ms
01-14 21:08:27.872: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process.
01-14 21:08:27.872: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=13655KB, Bitmap Size=14641KB, Limit=32768KB
01-14 21:08:27.872: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=1408KB
01-14 21:08:27.972: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes
01-14 21:08:27.972: D/dalvikvm(26585): GC_FOR_MALLOC freed 39K, 24% free 13615K/17735K, external 14641K/16689K, paused 96ms
01-14 21:08:28.092: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 40K, 24% free 13579K/17735K, external 14641K/16689K, paused 102ms
01-14 21:08:28.212: D/dalvikvm(26585): GC_EXTERNAL_ALLOC freed 41K, 24% free 13574K/17735K, external 14641K/16689K, paused 103ms
01-14 21:08:28.212: W/dalvikvm(26585): threadid=17: thread exiting with uncaught exception (group=0x4001d5a0)
01-14 21:08:28.252: E/dalvikvm-heap(26585): 2529792-byte external allocation too large for this process.
01-14 21:08:28.252: E/dalvikvm(26585): Out of memory: Heap Size=17735KB, Allocated=13585KB, Bitmap Size=13902KB, Limit=32768KB
01-14 21:08:28.252: E/dalvikvm(26585): Trim info: Footprint=17735KB, Allowed Footprint=17735KB, Trimmed=1468KB
01-14 21:08:28.352: E/GraphicsJNI(26585): VM won't let us allocate 2529792 bytes
任何人都可以帮助我吗?感谢
答案 0 :(得分:2)
您是否尝试过android:largeHeap="true"
中的Manifest.xml
?我也可以看到你正在处理位图,使用像这种方法的BitMapOptions:
private Bitmap getBitmap(String path) {
Uri uri = getImageUri(path);
InputStream in = null;
try {
final int IMAGE_MAX_SIZE = 1200000; // 1.2MP
in = mContentResolver.openInputStream(uri);
// Decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(in, null, o);
in.close();
int scale = 1;
while ((o.outWidth * o.outHeight) * (1 / Math.pow(scale, 2)) >
IMAGE_MAX_SIZE) {
scale++;
}
Log.d(TAG, "scale = " + scale + ", orig-width: " + o.outWidth + ",
orig-height: " + o.outHeight);
Bitmap b = null;
in = mContentResolver.openInputStream(uri);
if (scale > 1) {
scale--;
// scale to max possible inSampleSize that still yields an image
// larger than target
o = new BitmapFactory.Options();
o.inSampleSize = scale;
b = BitmapFactory.decodeStream(in, null, o);
// resize to desired dimensions
int height = b.getHeight();
int width = b.getWidth();
Log.d(TAG, "1th scale operation dimenions - width: " + width + ",
height: " + height);
double y = Math.sqrt(IMAGE_MAX_SIZE
/ (((double) width) / height));
double x = (y / height) * width;
Bitmap scaledBitmap = Bitmap.createScaledBitmap(b, (int) x,
(int) y, true);
b.recycle();
b = scaledBitmap;
System.gc();
} else {
b = BitmapFactory.decodeStream(in);
}
in.close();
Log.d(TAG, "bitmap size - width: " +b.getWidth() + ", height: " +
b.getHeight());
return b;
} catch (IOException e) {
Log.e(TAG, e.getMessage(),e);
return null;
}
来源:Android: Resize a large bitmap file to scaled output file