如何使用Glide加载媒体的专辑封面?
如何使用Glide加载媒体的专辑封面?
嘿,我看你遇到的问题根源其实是把歌曲ID和专辑ID搞混了!你现在用的是歌曲的ID(songList[position].id)去拼接专辑封面的Uri,但content://media/external/audio/albumart这个Uri对应的是专辑ID,不是歌曲的ID,所以肯定加载不出来~ 另外Glide确实没有loadFromMediaStore()这个方法,你应该是记错啦。
下面给你一步步讲正确的做法:
1. 先确保你的歌曲数据包含专辑ID
首先你在查询MediaStore获取歌曲列表的时候,一定要把MediaStore.Audio.Media.ALBUM_ID这个字段也查出来,存到你的歌曲对象里。比如你的歌曲数据类可以加个albumId属性:
data class Song( val id: Long, // 歌曲ID val path: String, // 歌曲路径 val albumId: Long // 新增专辑ID字段 )
查询MediaStore的示例代码(简化版):
val projection = arrayOf( MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID // 必须包含这个字段 ) contentResolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, null, null, null )?.use { cursor -> while (cursor.moveToNext()) { val songId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID)) val songPath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)) val albumId = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID)) songList.add(Song(songId, songPath, albumId)) } }
2. 用专辑ID构建正确的封面Uri
拿到歌曲对应的专辑ID后,再去拼接专辑封面的Uri:
val artworkUri = Uri.parse("content://media/external/audio/albumart") // 这里用的是专辑ID,不是歌曲ID! val albumArtUri = ContentUris.withAppendedId(artworkUri, songList[position].albumId)
3. 用Glide加载封面并处理异常
最后用Glide加载这个Uri,记得加上占位图和错误图——毕竟有些歌曲可能没有专辑封面,避免ImageView显示空白:
Glide.with(holder.songCover.context) .load(albumArtUri) .placeholder(R.drawable.your_default_cover) // 加载时显示的占位图 .error(R.drawable.your_default_cover) // 加载失败时显示的图 .into(holder.songCover)
这样应该就能正常加载专辑封面啦!
备注:内容来源于stack exchange,提问作者Mizuki
相关产品推荐
相关产品推荐

