Search code examples
androidbitmapout-of-memoryexpandablelistviewbitmapfactory

Out Of Memory Exception While Getting AlbumArt


Here i have created expandable list view which is having group row for Artist and in child it shows all albums for artist with album art. But It throws out of memory exception.

Here Is my code to get the Image :

public static Bitmap getArtwork(Context context, int album_id) {

        ContentResolver res = context.getContentResolver();
        Uri uri = ContentUris.withAppendedId(sArtworkUri, album_id);
        if (uri != null)
        {
            InputStream in = null;
            try 
            {
                in = res.openInputStream(uri);
                return BitmapFactory.decodeStream(in, null, sBitmapOptions);
            } catch (FileNotFoundException ex) 
            {
                // The album art thumbnail does not actually exist. Maybe the user deleted it, or
                // maybe it never existed to begin with.
            } finally
            {
                    if (in != null)
                    {
                        try
                        {
                            in.close();
                        } catch (IOException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                    }
                }
             }
        return null;
    }

And for creating child album list i have done this :

private ArrayList<ArrayList<HashMap<String, Object>>> createChildList() {
    for (int i = 0; i < songsListData.size(); i++) 
    {

        ArrayList<HashMap<String,Object>> secList = new ArrayList<HashMap<String,Object>>();
        String s[] = new String[]{songsListData.get(i).get("artistname")};
        String whereClause = MediaStore.Audio.Albums.ARTIST + " = ? ";

        Cursor cursor = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,null ,whereClause,s,null);

        if (cursor == null) 
        {
              //Query Failed , Handle error.
        }
        else if (!cursor.moveToFirst()) 
        {
             //No media on the device.
        }
        else
        {            
              int albumName = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM);
              int id = cursor.getColumnIndex(MediaStore.Audio.Albums._ID);
              int songcount = cursor.getColumnIndex(MediaStore.Audio.Albums.NUMBER_OF_SONGS);

              for(int j=0;j<cursor.getCount();j++)
              {
                    String Name = cursor.getString(albumName);
                    Integer albumid = cursor.getInt(id);                        
                    Bitmap bitmap = null;
                    bitmap = getArtwork(context, albumid); //calling function
                    if(bitmap == null)
                    {
                        bitmap = BitmapFactory.decodeResource(context.getResources(),R.drawable.wallpaper);
                    }   
                    HashMap<String, Object> album = new HashMap<String, Object>();
                    album.put("albumName",Name);
                    album.put("albumId", albumid);  
                    album.put("image", bitmap);  //storing image
                    album.put("songcount",cursor.getString(songcount) + " song");
                    secList.add(album);
                    cursor.moveToNext();
               }                  
           }
           cursor.close();   
           albumData.add(secList);
    }
    return albumData;
}

what should i do to handle out of memory exception.?? Pleaze give me some solution. Thanx.


Solution

  • Debug your code and trace heap size when it goes unexpectedly up that must be due to increase image Size you can use the Document to Get an idea that how Android calculate the Image Size

    public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
        int width = image.getWidth();
        int height = image.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // create a matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);
        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
                matrix, false);
        return resizedBitmap;
    }