У меня возникли проблемы с доступом к файлам .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
и использовать этот поток для копирования файла в каталог кеша.