我用下面的函数来获取在Android上联系人的照片,而该人的查找关键字给出:的OutOfMemoryError在Android中显示联系人的照片时(位图大小超过VM预算)
public Bitmap getContactPhoto(String lookup_key) {
Uri lookUpUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup_key);
Uri contentUri = ContactsContract.Contacts.lookupContact(ctx.getContentResolver(), lookUpUri);
InputStream stream = null;
try {
stream = ContactsContract.Contacts.openContactPhotoInputStream(ctx.getContentResolver(), contentUri);
}
catch (Exception e) {
}
if (stream != null) {
return BitmapFactory.decodeStream(stream, null, bitmapOptions);
}
else {
return null;
}
}
当我显示这些接触在列表视图中的照片,我有时读在开发者控制台的崩溃报告以下错误:
Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget(Heap Size=6023KB, Allocated=3002KB, Bitmap Size=27152KB)
这是否意味着我的应用程序可以使用大约堆3MB而是一个位图有大约27MB?
我读了很多关于内存不足错误的问题在这里对堆栈溢出,但它主要是关于:
- 泄漏环境,使垃圾收集器不能释放的资源
- 需要扩大规模巨大的位图
但是我怎样才能防止我的错误呢?由于我只能获取联系人的照片,因此我不知道是否有必须缩放的巨大位图。在这种情况下,泄漏情况似乎并非如此。
这是怎样的图像显示:
imageView.setVisibility(View.VISIBLE);
imageView.setBackgroundResource(R.drawable.background);
if (<BITMAP_OBJECT> != null) {
imageView.setImageBitmap(<BITMAP_OBJECT>);
}
else {
imageView.setImageBitmap(null);
}
该问题与您展示的内容无关。请附上getContactPhoto()调用的代码 – Blackbelt 2012-03-10 18:55:33
对不起,我现在添加了这个。 – caw 2012-03-10 19:16:38
你打电话给你发布在某种适配器上的最后一个片段吗 – Blackbelt 2012-03-10 19:56:04