как получить обложку музыкального альбома программно

#java #android #android-music-player

#java #Android #android-музыкальный проигрыватель

Вопрос:

Я хочу получить обложки музыкальных альбомов, чтобы отображать их в imageview из gridview. и это мой код

 void loadAudioData() {
        ContentResolver contentResolver = Objects.requireNonNull(getActivity()).getContentResolver();
        final Uri uri = MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI;
        final String albumId = MediaStore.Audio.Albums._ID;
        final String albumName = MediaStore.Audio.Albums.ALBUM;
        final String artist = MediaStore.Audio.Albums.ARTIST;
        final String albumArt = MediaStore.Audio.AlbumColumns.ALBUM_ART;
        final String album_id = MediaStore.Audio.AlbumColumns.ALBUM_ID;
        final Uri sArtworkUri = Uri.parse("content://media/external/audio/albumart");
        String[] projection = {albumId, albumName, artist, albumArt, album_id};
        Cursor cursor = contentResolver.query(uri, projection, null, null, null);

        Bitmap bitmap = null;
        if (cursor != null amp;amp; cursor.moveToFirst())
            while (cursor.moveToNext()) {
                long album_idx = cursor.getLong(cursor.getColumnIndexOrThrow(album_id));
                Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, album_idx);
                try {
                    bitmap = MediaStore.Images.Media.getBitmap(getContext().getContentResolver(), albumArtUri);
                } catch (IOException e) {
                    Log.e("bitmap = null", "bitmap = null");
                }
                if (bitmap == null)
                    songsList.add(new Songs(R.drawable.album_cover, cursor.getString(cursor.getColumnIndex(albumName)),
                            cursor.getString(cursor.getColumnIndex(artist))));
                else
                    songsList.add(new Songs(bitmap, cursor.getString(cursor.getColumnIndex(albumName)),
                            cursor.getString(cursor.getColumnIndex(artist))));
            }
        cursor.close();
    }
 

проблема в том, что bitmap всегда имеет значение null, а оператор else всегда выполняется, хотя для альбомов есть изображения обложек, и они отображаются в других установленных приложениях.
я перепробовал слишком много решений, но ни одно из них не помогло до конца

Ответ №1:

Попробуйте получить растровое изображение с помощью FileDescriptor. Смотрите обновленный код:

 while (cursor.moveToNext()) {
                long album_idx = cursor.getLong(cursor.getColumnIndexOrThrow(album_id));
                Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, album_idx);
                try {
                    ParcelFileDescriptor pfd = getContext().getContentResolver().openFileDescriptor(uri, "r");
                    if (pfd != null) {
                        FileDescriptor fd = pfd.fileDescriptor;
                        bitmap = BitmapFactory.decodeFileDescriptor(fd, null,options);
                        pfd.close();
                        fd = null;
                    }
                }catch (IOException e) {
                    Log.e("bitmap = null", "bitmap = null");
                }
                if (bitmap == null)
                    songsList.add(new Songs(R.drawable.album_cover, cursor.getString(cursor.getColumnIndex(albumName)),
                            cursor.getString(cursor.getColumnIndex(artist))));
                else
                    songsList.add(new Songs(bitmap, cursor.getString(cursor.getColumnIndex(albumName)),
                            cursor.getString(cursor.getColumnIndex(artist))));
            }
 

Комментарии:

1. К сожалению, тот же результат