0

我正在尝试为 Windows RT 设备开发应用程序。我目前面临的问题是基于下一个用例场景:

  • 用户定义一个名为“Song”的结构,该结构具有各种字段(标题、艺术家等),包括使用FileOpenPicker该类选择的音频文件。

我想将此结构保存在包含提供的信息(标题、艺术家、FullPathToAudio等)的 JSON 文件中,然后再加载该结构。打开现有歌曲后,我想访问音频文件并提供播放按钮。

问题是当我尝试通过StorageFile.GetFileFromPathAsync(currentSong.FullPathToAudio)应用程序访问文件时关闭。我从文件的Capabilities选项卡中检查了Removable Storage框,并为音频文件 (MP3) 添加了 FileTypeAssociation。Package.appxmanifest

Package.AppxManifest 文件更改如下:

<Applications>
    <Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="JamAid.App">
      <m2:VisualElements DisplayName="JamAid" Square150x150Logo="Assets\Logo.png" Square30x30Logo="Assets\SmallLogo.png" Description="JamAid" ForegroundText="light" BackgroundColor="#464646">
        <m2:SplashScreen Image="Assets\SplashScreen.png" />
      </m2:VisualElements>
      <Extensions>
        <Extension Category="windows.fileTypeAssociation">
          <FileTypeAssociation Name="mpfiles">
            <DisplayName>Mp3 Files</DisplayName>
            <EditFlags OpenIsSafe="true" />
            <SupportedFileTypes>
              <FileType ContentType="audio/mp3">.mp3</FileType>
            </SupportedFileTypes>
          </FileTypeAssociation>
        </Extension>
      </Extensions>
    </Application>
  </Applications>
  <Capabilities>
    <Capability Name="internetClient" />
    <Capability Name="removableStorage" />
  </Capabilities>

因为用户可能会创建包含大量歌曲的播放列表,所以无法将文件复制到应用程序目录或其他可访问位置...

编辑:我试图在本地机器上调试应用程序。现在,它不仅会关闭,还会出现以下错误:

mscorlib.dll 中出现“System.UnauthorizedAccessException”类型的异常,但未在用户代码中处理

WinRT 信息:无法访问指定的文件或文件夹(讠㣯ü)。该项目不在应用程序有权访问的位置(包括应用程序数据文件夹、可通过功能访问的文件夹以及 StorageApplicationPermissions 列表中的持久项目)。验证该文件未标记系统或隐藏文件属性。

附加信息:访问被拒绝。

如果有这个异常的处理程序,程序可以安全地继续。

4

1 回答 1

1

我发现我可以使用这个解决方案: http: //www.jonathanantoine.com/2012/08/06/keep-access-to-filesfolders-the-user-granted-you/

基本上,必须将位置存储在FutureAccessList中:

var picker = new FolderPicker();
picker.FileTypeFilter.Add("*.mp3");
var folder = await picker.PickSingleFolderAsync();

StorageApplicationPermissions.FutureAccessList.AddOrReplace(Token, folder);

并使用以下方法取回:

var folder = await StorageApplicationPermissions.FutureAccessList.GetFolderAsync(Token);
于 2014-02-24T11:17:00.983 回答