trocchietto trocchietto - 3 months ago 25
Android Question

outofmemory exception for Large Bitmap

I found a lot of documentation on how to load large Bitmaps and avoid outofmemory exception. but the problem is that I have to take the image from my MediaStore.Images.media so the classical

decodeFile(path,options)
indicated in the google documentation does not work to me

As you can see below I decommented the line
// Bitmap photo= Mediastore.Images
, that is the one that triggers the out of memory. on the other side adding
the line
Bitmap bm=BitmapFactory.decodeFile(selectedImageToUri,options)
returns
null
, although the compiler can see both the path in
selectedImageToUri
(that indicates the content provider where the pics are) than the options value, that I set to 8, because I want to subscale all the images

My question is how can I insert in bm the bitmap that is referring to the image selected by the user in the gallery. in the line
BitMap photo
does not return null and work really well, but I decommented because after I change a couple of images gives me outofmemory exception.

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) {


if (flagVariable) {

if (selectedImageToUri != null) {


// BitMap photo = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), Uri.parse(selectedImageToUri));


final BitmapFactory.Options options= new BitmapFactory.Options();
options.inSampleSize=8;


Bitmap bm = BitmapFactory.decodeFile(selectedImageToUri, options);

pic = new BitmapDrawable(bm);


getActivity().getWindow().setBackgroundDrawable(pic);


} else {
getDefaultImageBackground(inflater, container);

}


hiddenList = inflater.inflate(R.layout.fragment_as_list_layout_temp, container, false);

} else {
getDefaultImageBackground(inflater, container);
}

listView = (ListView) hiddenList.findViewById(R.id.list_hidden);

Answer

MediaStore.getBitmap is just a simple convienence method, it looks like this:

public static final Bitmap getBitmap(ContentResolver cr, Uri url)
                throws FileNotFoundException, IOException {
    InputStream input = cr.openInputStream(url);
    Bitmap bitmap = BitmapFactory.decodeStream(input);
    input.close();
    return bitmap;
}

You can create your own method based on this that takes the options and calls a different overload on BitmapFactory:

public static final Bitmap getBitmap(ContentResolver cr,
                                     Uri url,
                                     BitmapFactory.Options options)
                throws FileNotFoundException, IOException {
    InputStream input = cr.openInputStream(url);
    Bitmap bitmap = BitmapFactory.decodeStream(input, null, options);
    input.close();
    return bitmap;
}

Usage:

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;

Bitmap bm = getBitmap(getActivity().getContentResolver(),
                      Uri.parse(selectedImageToUri),
                      options);