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

如何在Uno Platform的Android端为MediaPlayerElement设置本地文件源?

解决Uno Platform跨平台播放FileOpenPicker选择的本地文件问题

问题核心在于Android和Windows对StorageFile的Path属性处理逻辑完全不同:

  • Windows平台下,StorageFile.Path返回本地文件系统的真实路径,因此直接用FileInfo验证或转换为file:// URI能正常工作;
  • Android平台下,FileOpenPicker返回的StorageFile.Path是content://开头的内容URI,并非真实文件路径,所以无法通过FileInfo验证存在性,直接转file:// URI也无法被MediaPlayer识别。

修复步骤

1. 使用跨平台兼容的MediaSource创建方式

直接调用MediaSource.CreateFromStorageFile()方法,传入获取到的StorageFile对象即可。该方法会自动适配不同平台的文件访问规则,无需手动处理路径转换。

2. 修正异步方法的写法

将async void改为async Task,避免异步操作中可能出现的异常丢失、上下文混乱等问题。

修复后的代码

private async Task PlayTrack(int queueIndex, int trackIndex)
{
    MediaPlayer.MediaPlayer.Pause();

    var selectedFile = queues[queueIndex].getTracks()[trackIndex];

    // 跨平台兼容的MediaSource创建方式
    MediaSource mediaSource = MediaSource.CreateFromStorageFile(selectedFile);

    MediaPlayer.Source = mediaSource;

    // 等待MediaSource加载完成后再播放,避免加载未就绪的问题
    await mediaSource.OpenAsync();
    MediaPlayer.MediaPlayer.Play();
}

额外说明

  • Android的content URI是系统ContentProvider提供的安全访问入口,直接操作路径会跳过权限验证导致访问失败,CreateFromStorageFile会自动处理ContentProvider的权限逻辑;
  • 如果需要验证文件是否可访问,不要用FileInfo,而是通过await selectedFile.OpenReadAsync()尝试打开流,通过捕获异常来判断文件的可访问性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:02:43