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

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权限
  • (可选)优化FileProvider路径配置
    你当前的配置开放了整个外部存储的共享权限,安全风险较高,可修改provider_paths.xml仅开放DCIM目录权限:
    <?xml version="1.0" encoding="utf-8"?>
    <paths>
        <external-path name="dcim" path="DCIM/"/>
    </paths>
    
    该配置和现有Uri生成逻辑完全兼容,无需修改其他代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:48:00