Android 11获取专辑封面:ContentResolver.loadThumbnail的URI参数疑问
关于Android 11中
ContentResolver.loadThumbnail的Uri参数详解 我完全懂你的困惑——官方文档的描述确实有点太笼统了,我刚接触这个API的时候也卡在这里好久。下面给你一步步拆解:
1. 第一个参数Uri到底是什么?
没错,它就是对应音乐条目的MediaStore Uri,但不是你随便从文件路径转的Uri,而是必须从系统媒体库(MediaStore)中查询得到的、指向具体音乐条目的标准Uri。
这个Uri的作用是告诉系统:“我要获取这首已经被媒体库索引的音乐的专辑封面缩略图”,系统会自动帮你找到关联的专辑资源并生成缩略图。
2. 如何获取这个Uri?
核心步骤是通过ContentResolver查询媒体库中的音频数据,提取音乐条目的ID,再构建对应的Uri:
步骤1:查询媒体库获取音乐ID
你可以根据歌曲名、歌手名等条件查询目标音乐的ID,举个Kotlin的例子:
// 定义要查询的字段:这里取ID和歌名用来定位 val projection = arrayOf( MediaStore.Audio.Media._ID, MediaStore.Audio.Media.TITLE ) // 假设你要找名为"xxx"的歌曲,构建查询条件 val selection = "${MediaStore.Audio.Media.TITLE} = ?" val selectionArgs = arrayOf("你的目标歌曲名称") // 执行查询 context.contentResolver.query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, selection, selectionArgs, null )?.use { cursor -> if (cursor.moveToFirst()) { // 提取音乐ID val idColumnIndex = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID) val songId = cursor.getLong(idColumnIndex) // 步骤2:构建目标Uri val targetUri = ContentUris.withAppendedId( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, songId ) // 现在就可以用这个targetUri调用loadThumbnail了 loadAlbumThumbnail(context, targetUri) } }
步骤2:调用loadThumbnail获取缩略图
拿到Uri后,直接调用API即可,注意指定你需要的缩略图尺寸:
private fun loadAlbumThumbnail(context: Context, songUri: Uri) { try { val thumbnailBitmap = context.contentResolver.loadThumbnail( songUri, Size(512, 512), // 按需设置尺寸,比如512x512 null // 可选:传入CancellationSignal可以取消加载 ) // 拿到Bitmap后,就可以设置到ImageView里了 // imageView.setImageBitmap(thumbnailBitmap) } catch (e: Exception) { // 处理加载失败的情况,比如显示默认封面 e.printStackTrace() } }
3. 关键注意事项
- 权限要求:Android 12及以下需要申请
READ_EXTERNAL_STORAGE权限;Android 13及以上可以申请更细粒度的READ_MEDIA_AUDIO权限,记得在Manifest中声明并动态申请。 - 不能用文件Uri:直接从文件路径转的Uri(比如
Uri.fromFile(file))是无效的,因为Android 11的Scoped Storage限制,系统无法通过这种Uri找到关联的专辑封面资源,必须用MediaStore提供的Uri。
内容的提问来源于stack exchange,提问作者borune
相关产品推荐
相关产品推荐

