You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 07:54:58