OutOfMemory-Исключение — decodeBitmap()

#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. Спасибо за ваш комментарий, но почему вы декодируете растровое изображение, затем устанавливаете размер выборки, а затем снова декодируете растровое изображение, на этот раз возвращая растровое изображение?