#android #camera #out-of-memory #onactivityresult
#Android #камера #нехватка памяти #onactivityresult
Вопрос:
В моем приложении я запускаю намерение камеры сделать снимок с помощью стандартного приложения камеры. Я сохраняю uri пути к изображению и в onActivityResult() Я получаю растровое изображение со следующим кодом:
Uri uri = Uri.fromFile(imgFile);
File dest = new File(uri.getPath());
FileInputStream fis;
try {
fis = new FileInputStream(dest);
Bitmap sourceBitmap = BitmapFactory.decodeStream(fis);
...
Моя проблема в том, что я получаю исключение OutOfMemoryException на одном из моих старых телефонов, но, что интересно, не с помощью .decodeStream(), но когда я увеличиваю представление во фрагменте, я вызываю для отображения растрового изображения:
view = inflater.inflate(R.layout.dialogfragment_image, container, true);
Я читал, что decodeStream() не очень эффективен и занимает много памяти. Похоже, что использование преобразователя содержимого не работает с некоторыми устройствами Samsung.
Итак, что я могу сделать, чтобы предотвратить исключение OutOfMemory?
Ответ №1:
Try This Code:-
BitmapFactory.Options options = new BitmapFactory.Options();
options.inDither = false;
options.inJustDecodeBounds = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inSampleSize = 1;
options.inPurgeable = true;
options.inPreferQualityOverSpeed = true;
options.inTempStorage=new byte[32 * 1024];
Bitmap sourceBitmap = BitmapFactory.decodeStream(fis,options);
and manifest file in this code use:-
<application
android:allowBackup="true"
android:icon="@drawable/app_icon"
android:label="@string/app_name"
android:largeHeap="true" //This line add in application tag
Ответ №2:
Вы можете масштабировать изображение до меньшего размера, чтобы предотвратить ошибку нехватки памяти, используя:
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 2;
if (height >= reqHeight || width >= reqWidth) {
inSampleSize *= 2;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(String file,
int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(file, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth,
reqHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(file, options);
}
Комментарии:
1. Спасибо за ваш комментарий, но почему вы декодируете растровое изображение, затем устанавливаете размер выборки, а затем снова декодируете растровое изображение, на этот раз возвращая растровое изображение?