Как отобразить изображение с локального Forder UWP - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь автоматически визуализировать (без взаимодействия с пользователем) изображение, сохраненное в C:\Myfolder\image.jpg в приложении UWP. Я знаю, что это горячая тема, и приложение 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 голосов
/ 08 января 2019

В настоящее время в UWP есть способы доступа к локальным файлам в любом месте диска. Вы можете объявить ограниченную возможность broadFileSystemAccess (см. документы ), которая позволит вам получить доступ к любому пути на диске с помощью API StorageFile (обратите внимание, что вы по-прежнему не можете получить доступ к этим путям с помощью классического System.IO API). Если вы включите broadFileSystemAccess, ваш код начнет работать как есть.

Однако, чтобы объявить эту возможность, ваше приложение должно иметь вескую причину , так как это потенциальная угроза безопасности для устройства пользователя. Документы Состояние:

Это ограниченная возможность. Доступ настраивается в Настройки> Конфиденциальность> Файловая система. Поскольку пользователи могут предоставлять или отклонять разрешение в любое время в Настройках, вы должны убедиться, что ваше приложение устойчиво к этим изменениям. Если вы обнаружите, что ваше приложение не имеет доступа, вы можете попросить пользователя изменить настройки, предоставив ссылку на статью о доступе к файловой системе Windows 10 и конфиденциальности. Обратите внимание, что пользователь должен закрыть приложение, переключить настройку и перезапустить приложение. Если они переключают параметр во время работы приложения, платформа приостановит ваше приложение, чтобы вы могли сохранить состояние, а затем принудительно прервет приложение, чтобы применить новый параметр. В обновлении за апрель 2018 года разрешение по умолчанию включено. В обновлении за октябрь 2018 года по умолчанию установлено значение Выкл.

Если вы отправляете в Магазин приложение, которое объявляет эту возможность, вам нужно будет предоставить дополнительные описания того, почему вашему приложению нужна эта возможность и как оно намеревается его использовать. Эта возможность работает для API в пространстве имен Windows.Storage. См. Раздел «Пример» в конце этой статьи, чтобы узнать, как включить эту функцию в вашем приложении.

Однако есть такие места, как ApplicationData.Current.LocalFolder или ApplicationData.Current.RoamingFolder, к которым вы можете получить доступ без дополнительных разрешений. Вы также можете объявить такие возможности, как musicLibrary и т. Д. Для доступа к библиотекам.

Наконец, вы также можете позволить пользователю выбрать файл вручную, используя диалоговое окно с использованием классов, таких как FileOpenPicker или FileSavePicker, а затем сохранить предоставленный доступ к этому файлу, используя StorageApplicationPermissions.FutureAccessList - подробнее об этом здесь .

Для получения подробной информации см. документы .

0 голосов
/ 08 января 2019

Вы не можете напрямую обращаться к таким файлам в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...