Обложка альбома не отображается в моем RecyclerView - PullRequest
0 голосов
/ 30 апреля 2018

Я хочу отобразить список песен, присутствующих в моем внутреннем хранилище, вместе с обложкой альбома. Я использую этот код для загрузки песен в моем списке.

private void getSongsList() {
    final Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    final String[] cursor_cols = { MediaStore.Audio.Media._ID,
            MediaStore.Audio.Media.ARTIST, MediaStore.Audio.Media.ALBUM,
            MediaStore.Audio.Media.TITLE, MediaStore.Audio.Media.DATA,
            MediaStore.Audio.Media.ALBUM_ID,
            MediaStore.Audio.Media.DURATION };
    final String where = MediaStore.Audio.Media.IS_MUSIC + "=1";
    final Cursor cursor = getActivity().getContentResolver().query(uri,
            cursor_cols, where, null, null);

    if(cursor != null && cursor.moveToFirst()) {
        do {
            String artist = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
            String album = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
            String songName = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
            String data = cursor.getString(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
            long albumId = cursor.getLong(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));

            int duration = cursor.getInt(cursor
                    .getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));
            Uri sArtworkUri = Uri
                    .parse("content://media/external/audio/albumart");
            Uri albumArtUri = ContentUris.withAppendedId(sArtworkUri, albumId);
            songsList.add(new SongData(songName, artist, data, album, albumArtUri, duration));

        }while (cursor.moveToNext());
        cursor.close();

        Collections.sort(songsList, new Comparator<SongData>(){
            public int compare(SongData a, SongData b){
                return a.getSongName().compareTo(b.getSongName());
            }
        });
    }
}

Я использую Glide, чтобы загрузить изображение в мое изображение, используя это

SongData sd = list.get(position);

Glide.with(context)
            .load(sd.getAlbumArtUri())
            .apply(new RequestOptions()
                    .placeholder(R.drawable.ic_music))
            .into(holder.albumArt);

Проблема в том, что все мои песни отображаются в моем RecyclerView, но не с обложкой альбома, а с изображением моего заполнителя. Ни у одной песни не было обложки альбома. Чтобы убедиться, что с моими песнями связана обложка альбома, я использовал другое приложение музыкального проигрывателя, и там отображаются обложки моих песен, что не так с моим кодом?

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

После многих проб и ошибок я наконец-то заставил это работать. Ошибка с приведенным выше кодом была как показано ниже

java.lang.SecurityException(External path: /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/1525023642395: Neither user 10108 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.)

Ури преобразовывал content://media/external/audio/albumart во внешний каталог /storage/emulated/0/Android/data/com.android.providers.media/albumthumbs/ и записывал или кэшировал обложку альбома из базы данных в хранилище устройства, но у него не было разрешения на запись. Поэтому просто предоставьте разрешение на запись для хранения, и оно будет работать

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

Также запросите разрешение для API> = 23. Вы также можете перейти и проверить обложки альбомов, которые кэшируются во внутренней директории хранения

Android/data/com.android.providers.media/albumthumbs/
0 голосов
/ 30 апреля 2018

Попробуйте это

Glide.with(context)
     .load(new File(sd.getAlbumArtUri().getPath())) // path of the album art
     .transform(new RequestOptions()
                .placeholder(R.drawable.ic_music))
     .into(holder.albumArt);
...