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
相关产品推荐
相关产品推荐

