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

Android 11访问图库视频URI生成缩略图报IllegalArgumentException如何解决

Android 11 加载视频缩略图报错问题解决方案

问题根因排查方向

1. 检查URI正确性

你报错的URI为content://media/external/images/media/355,前缀属于图片媒体集,不是视频的合法URI。查询MediaStore时需区分媒体类型:

  • 查询视频必须使用MediaStore.Video.Media.EXTERNAL_CONTENT_URI作为查询根URI,不要误用MediaStore.Images.Media.EXTERNAL_CONTENT_URI查询视频资源。

2. 检查分区存储权限

Android 11(API 30)访问其他应用创建的公共媒体文件,除了在AndroidManifest.xml中声明权限外,必须动态申请READ_EXTERNAL_STORAGE权限,仅静态声明无法获得文件访问权限。

优化方案

方案1:直接使用Glide加载视频URI(推荐)

Glide内部已经适配了不同Android版本的媒体加载逻辑,无需手动调用MediaMetadataRetriever获取帧,兼容性更强,代码示例:

GlideApp.with(context)
    .load(uri) // 直接传入查询到的合法视频URI
    .centerCrop()
    .placeholder(R.drawable.placeholder) // 可选,加载中占位
    .error(R.drawable.load_failed) // 可选,加载失败兜底
    .into(view)

方案2:修复自定义MediaMetadataRetriever逻辑

如果需要手动控制帧截取逻辑,按如下优化代码:

  1. 注意getFrameAtTime第一个参数单位为微秒,你当前传入的1000仅代表1毫秒,无法拿到1秒处的帧
  2. 必须捕获异常、用完释放资源,避免崩溃和内存泄漏
val mmr = MediaMetadataRetriever()
try {
    mmr.setDataSource(context, uri)
    // 示例:截取1秒处的帧,单位转微秒
    val bitmap = mmr.getFrameAtTime(1000 * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
    GlideApp.with(context)
        .load(bitmap)
        .centerCrop()
        .into(view)
} catch (e: Exception) {
    e.printStackTrace()
    // 加载失败的兜底逻辑
} finally {
    mmr.release() // 必须释放资源
}

内容的提问来源于stack exchange,提问作者Casey Perkins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:45:04