Xamarin Android 用Intent+FileProvider播放外置存储DCIM目录视频失败如何解决
解决方案
无法播放问题核心是未给第三方播放器授予FileProvider Uri的读取权限,其次可能存在权限、MIME类型匹配问题,按以下步骤修改即可:
- 新增Uri读取授权
启动Intent时必须添加FLAG_GRANT_READ_URI_PERMISSION标识,否则第三方视频应用没有权限访问你共享的内容Uri,会提示找不到文件。修改后的代码如下:Java.IO.File file = new Java.IO.File(file_path); // 先判断文件是否存在,排除路径错误问题 if (!file.Exists()) { Toast.MakeText(Android.App.Application.Context, "视频文件不存在", ToastLength.Long).Show(); return; } Android.Net.Uri photoURI = AndroidX.Core.Content.FileProvider.GetUriForFile( Android.App.Application.Context, Android.App.Application.Context.PackageName + ".provider", file ); Android.Content.Intent intent = new Android.Content.Intent(Android.Content.Intent.ActionView); // 授予目标应用Uri读取权限 intent.AddFlags(ActivityFlags.GrantReadUriPermission); // 明确指定MIME类型,避免模糊匹配失败 intent.SetDataAndType(photoURI, "video/mp4"); Xamarin.Forms.Forms.Context.StartActivity(intent); - 检查运行时权限申请
不同安卓版本需要提前动态申请对应的存储权限:- API ≤28:申请
READ_EXTERNAL_STORAGE权限 - API29~32:配合
requestLegacyExternalStorage="true"配置,申请READ_EXTERNAL_STORAGE权限 - API ≥33:
READ_EXTERNAL_STORAGE已废弃,需要申请READ_MEDIA_VIDEO权限
- API ≤28:申请
- (可选)优化FileProvider路径配置
你当前的配置开放了整个外部存储的共享权限,安全风险较高,可修改provider_paths.xml仅开放DCIM目录权限:
该配置和现有Uri生成逻辑完全兼容,无需修改其他代码。<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="dcim" path="DCIM/"/> </paths>
内容的提问来源于stack exchange,提问作者blacky99
相关产品推荐
相关产品推荐

