【问题标题】:Album art not appearing in my RecyclerView专辑封面没有出现在我的 RecyclerView 中
【发布时间】:2019-03-24 23:20:27
【问题描述】:

我想显示我内部存储中的歌曲列表以及专辑封面。我正在使用此代码加载列表中的歌曲。

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 中,但没有显示在专辑封面中,而是显示在我的占位符图像中。没有一首歌有专辑封面。为了确保我的歌曲有与之关联的专辑封面,我使用了另一个音乐播放器应用程序,并且我的歌曲专辑封面显示在那里我的代码有什么问题?

【问题讨论】:

    标签: java android android-recyclerview cursor android-glide


    【解决方案1】:

    试试这个

    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);
    

    【讨论】:

    • 它给出了一个错误,它说无法解析构造函数(android.net.uri)
    • 试试这个新文件(sd.getAlbumArtUri().getPath())。我也更新了答案
    • 我在 Glide 中看不到任何转换选项,就像你提到的我使用的是 Glide v 4.7.1。而且我使用了新代码,但没有任何收获
    【解决方案2】:

    经过多次尝试和错误,我终于成功了。上面代码的错误如下

    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.)
    

    Uri 将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/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多