Я использую следующую функцию, чтобы получить фотографию контакта в 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)
Означает ли это, что мое приложение может использовать около 3 МБ кучи, но одно растрового изображения было примерно 27MB?
Я прочитал много вопросов здесь на переполнение стека относительно OutOfMemory ошибки, но это было в основном о:
- протекающие контекстов, так что сборщик мусора не может освободить ресурсы
- огромные растровые изображения, которые должны быть расширены
Но как я могу предотвратить ошибку в моем случае? Поскольку я получаю только фотографии контактов, я не знаю, есть ли у меня огромные растровые изображения, которые нужно масштабировать. И утечка контекста, похоже, не имеет места здесь.
Это способ отображения изображения:
imageView.setVisibility(View.VISIBLE);
imageView.setBackgroundResource(R.drawable.background);
if (<BITMAP_OBJECT> != null) {
imageView.setImageBitmap(<BITMAP_OBJECT>);
}
else {
imageView.setImageBitmap(null);
}
проблема не связана с тем, что вы показываете. Пожалуйста, прикрепите код, где getContactPhoto() называется – Blackbelt
Извините, я добавил это сейчас. – caw
Вы называете последний фрагмент, который вы отправили в каком-то адаптере. – Blackbelt