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

