MediaElement不会播放设备内部存储器中的文件

时间:2015-02-25 15:33:09

标签: c# windows-phone-8.1 windows-8.1

我正在编写一个简单的应用程序,它在MediaElement的帮助下播放mp3文件。我的测试设备有SD卡。问题是应用程序可以从SD卡播放文件,但不能使用内部存储器中的相同文件。

以下是我的代码的简化部分:

  1. 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>
    
  2. 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);
        }
    }
    
  3. ItemViewModel.cs

    public class ItemViewModel
    {
        public StorageFile File { get; private set; }
    
        public ItemViewModel(StorageFile file)
        {
            File = file;
        }
    }
    
  4. 在列表中单击项目时,将提取文件路径并将其传递给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

1 个答案:

答案 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);
}
相关问题