Suggestions to avoid bitmap Out of Memory error Suggestions to avoid bitmap Out of Memory error android android

Suggestions to avoid bitmap Out of Memory error


just use this function to decode...this is perfect solution for your error..because i also getting same error and i got this solution..

public static Bitmap decodeFile(File f,int WIDTH,int HIGHT){     try {         //Decode image size         BitmapFactory.Options o = new BitmapFactory.Options();         o.inJustDecodeBounds = true;         BitmapFactory.decodeStream(new FileInputStream(f),null,o);         //The new size we want to scale to         final int REQUIRED_WIDTH=WIDTH;         final int REQUIRED_HIGHT=HIGHT;         //Find the correct scale value. It should be the power of 2.         int scale=1;         while(o.outWidth/scale/2>=REQUIRED_WIDTH && o.outHeight/scale/2>=REQUIRED_HIGHT)             scale*=2;         //Decode with inSampleSize         BitmapFactory.Options o2 = new BitmapFactory.Options();         o2.inSampleSize=scale;         return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);     } catch (FileNotFoundException e) {}     return null; }


Hi you have to decode the file . for this try with the following method.

  public static Bitmap new_decode(File f) {        // decode image size        BitmapFactory.Options o = new BitmapFactory.Options();        o.inJustDecodeBounds = true;        o.inDither = false; // Disable Dithering mode        o.inPurgeable = true; // Tell to gc that whether it needs free memory,                                // the Bitmap can be cleared        o.inInputShareable = true; // Which kind of reference will be used to                                    // recover the Bitmap data after being                                    // clear, when it will be used in the future        try {            BitmapFactory.decodeStream(new FileInputStream(f), null, o);        } catch (FileNotFoundException e1) {            // TODO Auto-generated catch block            e1.printStackTrace();        }        // Find the correct scale value. It should be the power of 2.        final int REQUIRED_SIZE = 300;        int width_tmp = o.outWidth, height_tmp = o.outHeight;        int scale = 1;        while (true) {            if (width_tmp / 1.5 < REQUIRED_SIZE && height_tmp / 1.5 < REQUIRED_SIZE)                break;            width_tmp /= 1.5;            height_tmp /= 1.5;            scale *= 1.5;        }        // decode with inSampleSize        BitmapFactory.Options o2 = new BitmapFactory.Options();        // o2.inSampleSize=scale;        o.inDither = false; // Disable Dithering mode        o.inPurgeable = true; // Tell to gc that whether it needs free memory,                                // the Bitmap can be cleared        o.inInputShareable = true; // Which kind of reference will be used to                                    // recover the Bitmap data after being                                    // clear, when it will be used in the future        // return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);        try {//          return BitmapFactory.decodeStream(new FileInputStream(f), null,//                  null);            Bitmap bitmap= BitmapFactory.decodeStream(new FileInputStream(f), null, null);            System.out.println(" IW " + width_tmp);            System.out.println("IHH " + height_tmp);                          int iW = width_tmp;                int iH = height_tmp;               return Bitmap.createScaledBitmap(bitmap, iW, iH, true);        } catch (OutOfMemoryError e) {            // TODO: handle exception            e.printStackTrace();            // clearCache();            // System.out.println("bitmap creating success");            System.gc();            return null;            // System.runFinalization();            // Runtime.getRuntime().gc();            // System.gc();            // decodeFile(f);        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();            return null;        }    }


By Reducing/Scale size of the Image you can get rid out of the Out of Memory Exception,Try this

  BitmapFactory.Options options = new BitmapFactory.Options();  options.inSampleSize = 6;   Bitmap receipt = BitmapFactory.decodeFile(photo.toString(),options);  //From File You can customise on your needs.