Android 11及以上版本MediaStore.IS_FAVORITE无法获取有效值求助
解决Android 11+无法获取MediaStore.MediaColumns.IS_FAVORITE有效值的问题
问题原因及解决办法:
查询Uri范围错误:
MediaStore.Files.getContentUri("external_primary")会查询所有文件条目,但IS_FAVORITE列仅对系统标记为收藏的图片、视频、音频等媒体文件生效,普通文件该字段默认返回0。你需要针对具体媒体类型的Uri进行查询:- 图片:
MediaStore.Images.Media.EXTERNAL_CONTENT_URI - 视频:
MediaStore.Videos.Media.EXTERNAL_CONTENT_URI - 音频:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
- 图片:
权限配置问题:
Android 11及以上版本,需要申请对应的媒体权限而非旧的READ_EXTERNAL_STORAGE:- 图片/视频:
android.permission.READ_MEDIA_IMAGES、android.permission.READ_MEDIA_VIDEO - 音频:
android.permission.READ_MEDIA_AUDIO
确保在Manifest中声明权限,并在运行时请求授权。
- 图片/视频:
代码优化建议:
修改查询Uri后,调整CursorLoader的初始化代码,同时在解析cursor时,明确判断收藏状态(1为已收藏,0为未收藏):
// 以图片为例,替换为对应媒体类型的Uri val cursorLoader = CursorLoader( context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, PROJECTION_30, selection, selectionArgs, null ) fun fromCursor(cursor: Cursor): MediaModel { try { val id = cursor.getLong(cursor.getColumnIndex(MediaStore.Files.FileColumns._ID)) val mimeType = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE)) val size = cursor.getLong(cursor.getColumnIndex(MediaStore.MediaColumns.SIZE)) val width = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns.WIDTH)) val height = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns.HEIGHT)) val favorite = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { val index = cursor.getColumnIndex(MediaStore.MediaColumns.IS_FAVORITE) if (index >= 0) { // 1表示已收藏,0表示未收藏 cursor.getInt(index) == 1 } else { false } } else { false } // 构建并返回MediaModel return MediaModel(id, mimeType, size, width, height, favorite) } catch (e: Exception) { e.printStackTrace() // 处理异常,返回默认模型或空值 return MediaModel() } }
额外说明:
如果需要同时查询多种媒体类型,建议分别针对不同Uri查询后合并结果,避免使用MediaStore.Files的Uri导致IS_FAVORITE字段失效。
内容的提问来源于stack exchange,提问作者Ruowen
相关产品推荐
相关产品推荐

