0
votes
ContentResolver contentResolver1 = getActivity().getContentResolver();
Uri uri1 = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
String[] projection1 = new String[]{MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART};
String selection1 = MediaStore.Audio.Albums._ID + " = ?";
String[] selectionArgs1 = new String[]{String.valueOf(albumId)};  //albumId is MediaStore.Audio.Media.ALBUM_ID

Cursor cursor1 = contentResolver1.query(uri1, projection1, selection1, selectionArgs1, null);

if (cursor1 != null) {
   if (cursor1.moveToFirst()) {
       String albumPath = cursor1.getString(cursor1.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
       if (albumPath != null)
           albumArt = BitmapFactory.decodeFile(albumPath);          
   }
   cursor1.close();
}

BitmapFactory.decodeFile(albumPath) gives a FileNotFoundException even though albumPath has the following value- /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1502945757087

The comment on this answer says the same thing about using filepath to get bitmap from BitmapFactory.decodeFile() which isn't working in my case. How to use the above path to get a bitmap?

3
what is your albumPath value? it is null?redAllocator
nope. it has a proper path, as mentioned in the question.Darshan Miskin
You have to request permission. You don't have to get path. please read it again The quick one is to lower targetApi to 22 (build.gradle file).redAllocator

3 Answers

0
votes

Try this:

  Cursor cursor = getActivity().managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, 
                    new String[] {MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM_ART}, 
                    MediaStore.Audio.Albums._ID+ "=?", 
                    new String[] {String.valueOf(id_alnum)}, 
                    null);

    if (cursor.moveToFirst()) {
        String path = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM_ART));
        //TODO code
    }
-1
votes

This example uses a string of the full filepath to your albumart

     public static Bitmap decodeSampledBitmapFromFile(String picture, int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(picture, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(picture, options);
}


   public static int calculateInSampleSize(
        BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

some additional example where you use uri's (Source: smoothie by Lucas Rocha):

    private Bitmap decodeSampledBitmapFromResource(Uri imageUri, int reqWidth,
        int reqHeight) {
    InputStream is = null;
    try {
        is = mContext.getContentResolver().openInputStream(imageUri);
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(is, null, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth,
                reqHeight);
        options.inJustDecodeBounds = false;
        is = mContext.getContentResolver().openInputStream(imageUri);
        return BitmapFactory.decodeStream(is, null, options);
    } catch (FileNotFoundException e) {
   //     e.printStackTrace();
        return null;
    } finally {
        try {
            if (is != null) {
                is.close();
            }
        } catch (IOException e) {
    //      e.printStackTrace();
        }
    }
}
@Override
public Bitmap loadItem(Long id) {
    Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
    Uri imageUri = Uri.withAppendedPath(sArtworkUri, String.valueOf(id));
    Resources res = mContext.getResources();
    int width = res.getDimensionPixelSize(R.dimen.image_width);
    int height = res.getDimensionPixelSize(R.dimen.image_height);

    Bitmap bitmap = null;

    try {
        bitmap = decodeSampledBitmapFromResource(imageUri, width, height);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return bitmap;
}

for example, looking for albumart for track with id =3, using the uri method:

imageUri = content://media/external/audio/albumart/3
sArtworkUri=content://media/external/audio/albumart
-2
votes

You have to request permission. You don't have to get path. please read it again

The quick one is to lower targetApi to 22 (build.gradle file).

or using new ask-for-permission model:

Requesting Permissions at Run Time