我正在编写一个简单的应用程序,它在MediaElement的帮助下播放mp3文件。我的测试设备有SD卡。问题是应用程序可以从SD卡播放文件,但不能使用内部存储器中的相同文件。
以下是我的代码的简化部分:
MainPage.xaml中
<Page
x:Class="TestApp.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="using:TestApp"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"
mc:Ignorable="d">
<Page.Resources>
<DataTemplate x:Key="StorageItemDataTemplate">
<TextBlock Text="{Binding File.Name}" />
</DataTemplate>
</Page.Resources>
<Grid>
<ListView
x:Name="List"
IsItemClickEnabled="True"
ItemClick="List_OnItemClick"
ItemTemplate="{StaticResource StorageItemDataTemplate}" />
<MediaElement x:Name="Media" />
</Grid>
</Page>
MainPage.xaml.cs中
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
protected async override void OnNavigatedTo(NavigationEventArgs e)
{
IReadOnlyList<StorageFile> items =
await KnownFolders.MusicLibrary.GetFilesAsync();
List.ItemsSource = items.Select(item => new ItemViewModel(item));
}
private void List_OnItemClick(object sender, ItemClickEventArgs e)
{
var item = (ItemViewModel) e.ClickedItem;
Media.Source = new Uri(item.File.Path);
}
}
ItemViewModel.cs
public class ItemViewModel
{
public StorageFile File { get; private set; }
public ItemViewModel(StorageFile file)
{
File = file;
}
}
在列表中单击项目时,将提取文件路径并将其传递给MediaElement。 Next MediaElement播放音频。
如果文件在内部存储器中,则文件路径将如下所示:
C:\\Data\\Users\\Public\\Music\\file.mp3
如果它在SD卡上:
D:\\Music\\file.mp3
应用程序的清单具有下一个检查功能:
Music library
Removable storage
问题出在哪里?
UPD
订阅了MediaElement的MediaOnMediaFailed事件后,我收到了下一条错误消息:
MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED : HRESULT - 0x80070005
0x80070005
表示Access Denied
。
答案 0 :(得分:1)
我不确定它是否可以通过传递 Uri - StorageFile 正在使用文件代理,它利用声明的功能,从而访问外部文件该应用程序是可能的。如果你这样做它应该工作:
private async void List_OnItemClick(object sender, ItemClickEventArgs e)
{
var item = (ItemViewModel) e.ClickedItem;
var stream = await item.File.OpenAsync(FileAccessMode.Read);
Media.SetSource(stream, item.File.ContentType);
}