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

Android 11系统下ExoPlayer播放视频报Source error问题求解

问题解决方法

核心原因

  • Android 11 开始强制执行分区存储,禁止应用直接使用file://格式的URI访问公共存储目录下的媒体文件,你当前播放代码里创建MediaItem时误用了Uri.fromFile()生成的file://URI,导致ExoPlayer无权限读取资源,抛出Source error
  • 你保存视频的代码里将MediaStore.Video.Media.IS_PENDING设为1后,没有在写入完成后将其修改为0,标记为待写入状态的文件无法被正常读取

修复步骤

步骤1:修正视频保存逻辑,写入完成后更新文件状态

你写入视频数据完成后,需要更新ContentValues将IS_PENDING改为0,示例代码:

// 视频数据流写入完成后执行
contentValues.clear();
contentValues.put(MediaStore.Video.Media.IS_PENDING, 0);
getContentResolver().update(mUri, contentValues, null, null);

步骤2:修正播放逻辑,使用正确的Content URI

你已经通过FileProvider生成了合法的Content URI,直接用它创建MediaItem即可,不要用Uri.fromFile()生成的file URI,修正后的代码片段:

// 你已经生成了正确的FileProvider URI
Uri videoURI = FileProvider.getUriForFile(
    this, VideoPlayerActivity.this.getPackageName() + ".provider",
    new File(videoPath));

// 把原来的Uri.fromFile替换成videoURI即可
MediaItem mediaItem = MediaItem.fromUri(videoURI);
exoPlayer.setMediaItem(mediaItem);

可选优化:直接传递MediaStore URI

你保存视频时已经得到了MediaStore返回的mUri,可以直接将这个URI传递到播放页使用,不需要再通过文件路径转FileProvider URI,效率更高也更稳定。

额外说明

你调用第三方应用打开正常,是因为你用了FileProvider生成的合法Content URI,同时授予了读取权限,所以第三方应用可以正常访问,而自己的播放逻辑刚好没用这个正确的URI才导致报错。如果你的应用targetSdkVersion>=30,只要是自己写入公共媒体目录的文件,不需要申请特殊权限,只要用正确的Content URI就可以正常读取。

内容的提问来源于stack exchange,提问作者All in One King Official

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:57:02