Как получить URL / путь к встроенному файлу в Xamarin.Forms

У меня возникли проблемы с доступом к файлам .mp4, встроенным в мой проект Xamarin.Forms. Согласно документу « Обработка файлов в документации Xamarin.Forms» , он говорит:

Путь файла на каждой платформе можно определить из библиотеки .NET Standard, используя значение перечисления Environment.SpecialFolder как первый аргумент метода Environment.GetFolderPath . Затем это можно объединить с именем файла с Path.Combine метода Path.Combine .

Я также следил за инструкциями на странице, в которых говорится, что вы установите для «Build Action» значение «EmbeddedResource» для файлов. В конечном итоге я пытаюсь получить путь / url файла, чтобы передать его в функцию CrossMediaManager.Current.Play() . Вот код, который постоянно терпел неудачу, независимо от того, насколько я его настраиваю. Большая часть этого была взята непосредственно из документации Xamarin, приведенной выше:

// Gets the path to the video file.
string fileDirectory = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string file = "Signing.video.banana.mp4";
string pathToFile = Path.Combine(fileDirectory, file);

// Print some info about the file and its directory
System.Diagnostics.Debug.WriteLine(pathToFile);
System.Diagnostics.Debug.WriteLine(File.Exists(pathToFile));

Файл .mp4 находится в папке «видео», которая находится непосредственно в проекте «Подписание». Я попытался настроить путь к файлу, так что это всего лишь файл, это только папка с файлами и видео, и я попытался использовать '/' вместо '.' для разделения каталогов. Распечатка, которую я всегда получаю, заключается в том, что файл не существует. Путь, который был напечатан, всегда выглядит примерно так, когда он запускается на эмуляторе iOS:

/Users/doug/Library/Developer/CoreSimulator/Devices/FD9E9045-EF6A-4ECA-9192-25CEC0E7C23C/data/Containers/Data/Application/AF92806E-C68F-45ED-814D-C383821F470A/Documents/Signing.video.banana.mp4

Я видел предложения, предлагающие добавить «file: //» в начало пути файла, а также другие подобные предложения. Ничего не работает. Как вставить файл в Xamarin.Forms, а затем восстановить его путь к файлу?

Всего 1 ответ


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

Используя Xamarin.Essentials вы можете получить каталог кэша ОС, а затем скопировать ресурс на него и воспроизвести его через file:// url.

Пример:

var cacheFile = Path.Combine(FileSystem.CacheDirectory, "cached.mp4");
if (File.Exists(cacheFile))
    File.Delete(cacheFile);
using (var resource = Assembly.GetExecutingAssembly().GetManifestResourceStream("YourFullEmbeddedResourceResourceID.mp4"))
using (var file = new FileStream(cacheFile, FileMode.Create, FileAccess.Write))
{
    resource.CopyTo(file);
}
await CrossMediaManager.Current.Play(new MediaFile("file://localhost/" + cacheFile, MediaFileType.Video, ResourceAvailability.Local));

Примечание. Лично я не буду использовать встроенные ресурсы, поскольку они раздувают ваши сборки (или сегменты .text в родных библиотеках) и, следовательно, потребляют память приложения, вызывают более медленное время загрузки и т. Д., Но используют файлы на основе родных пакетов / активов и копируют их в директорию кеша. Вы можете использовать Xamarin.Essentials для получения этих файлов с OpenAppPackageFileAsync / доступным только для чтения через OpenAppPackageFileAsync и использовать этот поток для копирования файла в каталог кеша.


Есть идеи?

10000