Как загрузить и отобразить любое видео с моего компьютера в UWP (C ++) - PullRequest
0 голосов
/ 31 мая 2018

Я застрял, пытаясь реализовать функцию для приложения UWP, которое я делаю.У меня есть MediaElement, объявленный в моем документе XAML следующим образом:

<MediaElement x:Name="_media" AutoPlay="True" IsLooping="True" Margin="0,0,8,227" AreTransportControlsEnabled="true" RenderTransformOrigin="0.499,0.41" >
        <MediaElement.RenderTransform>
            <CompositeTransform ScaleX="1"/>
        </MediaElement.RenderTransform>
</MediaElement>

Мне нужно иметь возможность загружать видео из любого места на моем компьютере, но UWP не может получить доступ ко всем каталогам.Я загружаю видеофайлы через кнопку (код ниже).Короче говоря, я пытаюсь скопировать файл в папку LocalAppData, потому что я знаю, что у меня есть разрешение на доступ к файлам там.

Первый вопрос: Могу ли я копировать файлы с помощью CopyFileA () способомчто я использую это в коде ниже?

Второй вопрос После копирования файла мне нужно добавить его в Активы моего приложения .Как я могу сделать это с помощью кода?

Вот код, который я запускаю при попытке загрузить файл.

void SDKTemplate::Scenario4_ReproVideo::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
    //This lines are here to get the path of the local folder of my app
    Windows::Storage::StorageFolder^ f = Windows::Storage::ApplicationData::Current->LocalFolder;
    stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert_local_path;
    Platform::String^ path_ss = f->Path;
    txtBlockOutput->Text = path_ss;
    std::string path_local = convert_local_path.to_bytes(path_ss->Data());



    FileOpenPicker^ fop = ref new FileOpenPicker();
    fop->SuggestedStartLocation = PickerLocationId::Desktop;
    fop->FileTypeFilter->Append(".mp4");
    fop->FileTypeFilter->Append(".wmv");


    create_task(fop->PickSingleFileAsync()).then([this](StorageFile^ file) {
        if (file)
        {


            //We take the path of the file
            Platform::String^ path = file->Path;
            stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert_path;
            std::string sourcePath = convert_path.to_bytes(path->Data());

            //We take the name of the file
            Platform::String^ name = file->Name;
            stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert_name;
            std::string name_s = convert_name.to_bytes(name->Data());

            //We find out the local path (again) not sure if needed
            Platform::String^ path_ss = Windows::Storage::ApplicationData::Current->LocalFolder->Path;
            stdext::cvt::wstring_convert<std::codecvt_utf8<wchar_t>> convert_local_path;            
            std::string path_local = convert_local_path.to_bytes(path_ss->Data());

            // Use Path class to manipulate file and directory paths.
            std::string sourceFile = sourcePath +"/" + name_s;
            std::string destFile = path_local +"/"+ name_s;

            if (CopyFileA(sourceFile.c_str(), destFile.c_str(), FALSE)) {
                txtBlockOutput->Text = "File is copied into local directory";
            }
            else { txtBlockOutput->Text = "File didn't copy"; }



            _media->Source = ref new Uri(destFile);
        }
        else
        {
            txtBlockOutput->Text = "Operation cancelled.";
        }
    });

1 Ответ

0 голосов
/ 01 июня 2018

В Windows 10 версии 1803, SDK build 17134 вы можете получить доступ ко всем файлам, к которым у пользователя есть доступ, с помощью функции broadFileSystemAccess.

С другой стороны, ваше приложение имеет разрешение на доступ к локальному расположению LocalAppData, вы можете получить прямой доступ к файлу, используя ms-appdata uri,

using Windows::Storage;
auto getFileTask = create_task(StorageFile::GetFileFromApplicationUriAsync(ref new Uri("ms-appdata:///local/file.txt")));
getFileTask.then([](StorageFile^ file) 
{
    // Process file
});

Так что вы не можетенеобходимо скопировать файл в папку «Ресурсы» вашего приложения.Кроме того, папка «Ресурсы» приложения доступна только для чтения и недоступна для записи после развертывания.Вы не можете вносить какие-либо изменения в код своего приложения, включая создание или копирование файла в эту папку.

Вам следует заглянуть в документ Права доступа к файлу , чтобы получить более подробную информацию о доступе к файлу и получитькод ссылки из официального FileAccess образца кода.

--- Обновление для добавления возможности broadFileSystemAccess ---

Во-первых, щелкните правой кнопкой мыши файл Package.appxmanifestи выберите Просмотр кода , вы сможете увидеть код в манифесте.

Во-вторых, на верхней вкладке добавьте следующий код, xmlns:rescap="..." и поместите rescap взначение IgnorableNamespaces, выглядит как IgnorableNamespaces="uap mp rescap", выглядит,

<Package
  ...
  xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">

Наконец, добавьте возможность broadFileSystemAccess во вкладку,

<Capabilities>
    <rescap:Capability Name="broadFileSystemAccess" />
</Capabilities>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...