UWP MediaElement播放本地音乐失败:MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED错误修复
解决UWP MediaElement播放本地桌面音乐文件的权限错误
这个错误 MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005 本质是UWP沙箱权限限制导致的——你的应用默认没有访问桌面这类应用包外目录的权限,而Assets文件夹属于应用包内部,所以能正常播放。下面是具体的解决方案:
一、先配置文件访问权限
根据你的需求(批量播放本地任意文件夹音乐),有两种权限配置方式:
1. 访问系统音乐库
如果你的音乐都放在系统音乐库,只需在Package.appxmanifest中添加音乐库权限:
<Capabilities> <!-- 保留其他已配置的权限 --> <Capability Name="musicLibrary" /> </Capabilities>
2. 访问任意文件夹(如桌面、自定义文件夹)
如果要播放桌面或其他非系统库的文件夹,需要开启BroadFileSystemAccess权限:
- 在
Package.appxmanifest中添加权限声明:
return (<Capabilities> <!-- 保留其他已配置的权限 --> <uap:Capability Name="broadFileSystemAccess" /> </Capabilities> )
2. 手动开启系统权限:打开Windows设置 → 应用 → 找到你的UWP应用 → 权限 → 文件系统 → 勾选“允许此应用访问你的文件”。 ## 二、使用正确的播放代码 UWP沙箱禁止直接通过本地路径Uri访问外部文件,必须通过`StorageFile`获取文件流后调用`SetSource`方法: ```csharp // 假设music是你获取到的音乐文件信息 var file = await StorageFile.GetFileFromPathAsync(music.Path); // 获取文件可读流 var fileStream = await file.OpenAsync(FileAccessMode.Read); // 设置MediaElement的源并播放 MediaPlayer.SetSource(fileStream, file.ContentType); MediaPlayer.Play();
三、批量播放的实现思路
要批量播放本地文件夹音乐,建议通过StorageFolder遍历文件夹内的文件:
// 示例:获取桌面文件夹(需要BroadFileSystemAccess权限) StorageFolder targetFolder = KnownFolders.Desktop; // 获取文件夹内所有音乐文件(可通过文件扩展名过滤) var musicFiles = await targetFolder.GetFilesAsync(CommonFileQuery.OrderByName); // 遍历文件,可将文件对象存储到播放列表中 foreach (var file in musicFiles) { // 这里可将file添加到自定义的播放列表集合中 // 播放时直接调用SetSource即可 }
为什么之前的Uri方式不行?
UWP的Uri方式仅支持两种场景:
- 访问应用包内资源(如
ms-appx:///Assets/test.mp3) - 访问通过
FileOpenPicker选择的文件(选择器会临时授予应用该文件的访问权限)
而直接使用本地绝对路径(如C:\Users\XXX\Desktop\test.mp3)会被沙箱拦截,因为应用没有对应的访问权限,这就是你报错的核心原因。
内容的提问来源于stack exchange,提问作者user10634280
相关产品推荐
相关产品推荐

