如何显示图像形式的本地UWP

时间:2019-01-08 12:20:13

标签: c# uwp

我正在尝试自动可视化(无需用户交互)在UWP应用中保存在C:\Myfolder\image.jpg中的图像。我知道这是一个热门话题,UWP应用程序只能访问文件系统的某些“部分”,但我还阅读到有不同的解决方案可以解决此问题,例如this

尝试一下: mainpage.cs

BitmapImage bitmap = new BitmapImage();
StorageFolder folder = await StorageFolder.GetFolderFromPathAsync(@"C:\MyFolder");
StorageFile file = await folder.GetFileAsync("image.jpg");
using (var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
{
     bitmap.SetSource(stream);
     image0.Source = bitmap;
}

还在appxmanifest中添加以下行:

<Applications>
<Application Id="App" Executable="$targetnametoken$.exe" EntryPoint="App">
<Extensions>
    <uap:Extension Category="windows.fileTypeAssociation">
      <uap:FileTypeAssociation Name="jpegfiles">
        <uap:SupportedFileTypes>
          <uap:FileType>.jpg</uap:FileType>
        </uap:SupportedFileTypes>
      </uap:FileTypeAssociation>
    </uap:Extension>
  </Extensions>
  </Application>
 </Applications>
 <Capabilities>
   <Capability Name="internetClient" />
   <Capability Name="privateNetworkClientServer" />
   <Capability Name="internetClientServer" />
   <uap:Capability Name="enterpriseAuthentication" />
   <uap4:Capability Name="userDataTasks" />
   <DeviceCapability Name="microphone" />
 </Capabilities>

不幸的是,我总是遇到类似System.UnauthorizedAccessException: 'Access is denied.

的错误

我还试图在Image对象内部写出图像的直接路径,

 image0.Source = new BitmapImage(new Uri(@"C:\Myfolder\image.jpg"));

,在这种情况下,该应用会启动,但不会显示任何内容。

也许我错过了一些东西,或者我不明白如何设置文件访问权限。

2 个答案:

答案 0 :(得分:5)

实际上,现在有一些方法可以访问UWP中磁盘上任何位置的本地文件。您可以声明受限的broadFileSystemAccess功能(请参阅docs),该功能将允许您使用StorageFile API访问磁盘上的任何路径(请注意,您仍然无法访问这些路径使用经典的System.IO API)。 如果启用broadFileSystemAccess,您的代码将按原样开始工作。

但是,要声明此功能,您的应用需要有一个充分理由,因为它会对用户设备造成潜在的安全威胁。 Docs状态:

  

这是受限制的功能。可在“设置”>“隐私”>“文件系统”中配置访问权限。由于用户可以随时在“设置”中授予或拒绝权限,因此您应确保您的应用对这些更改具有弹性。如果发现您的应用没有访问权限,则可以选择提供Windows 10文件系统访问和隐私文章的链接来提示用户更改设置。请注意,用户必须关闭应用程序,切换设置,然后重新启动应用程序。如果他们在应用程序运行时切换设置,平台将暂停您的应用程序,以便您可以保存状态,然后强行终止应用程序以应用新设置。在2018年4月更新中,权限的默认值为``开''。在2018年10月更新中,默认值为“关闭”。

     

如果您向应用商店提交了声明此功能的应用程序,则需要提供其他说明,说明您的应用程序需要此功能的原因以及打算如何使用它。此功能适用于Windows.Storage命名空间中的API。有关如何在您的应用中启用此功能的示例,请参见本文末尾的“示例”部分。

但是,您可以在没有其他权限的情况下访问ApplicationData.Current.LocalFolderApplicationData.Current.RoamingFolder之类的位置。您还可以声明诸如musicLibrary之类的功能来访问库。

最后,您还可以让用户使用对话框使用FileOpenPickerFileSavePicker之类的对话框手动选择文件,然后使用StorageApplicationPermissions.FutureAccessList保留对该文件的授予访问权限-了解更多关于here

有关详细信息,请参见docs

答案 1 :(得分:1)

您无法直接访问UWP中的文件。 真正的问题是您使用的路径受到保护。您还需要在UWP授予您的应用访问权限的文件夹中工作。

您可以在以下位置获得更多信息:

https://docs.microsoft.com/en-us/windows/uwp/files/quickstart-reading-and-writing-files

您将要执行以下操作:

Windows.Storage.StorageFolder storageFolder =
    Windows.Storage.ApplicationData.Current.LocalFolder;
Windows.Storage.StorageFile sampleFile =
    await storageFolder.GetFileAsync("your.bmp");

然后您就可以开始使用该文件了。

以下链接还显示了如何枚举“图片”文件夹中的文件: https://docs.microsoft.com/en-us/windows/uwp/files/quickstart-listing-files-and-folders