我无法访问Xamarin.Forms项目中嵌入的.mp4文件。根据{{3}}文档说,
每个平台上文件的路径都可以通过.NET确定 标准库使用
Environment.SpecialFolder
的值 枚举作为Environment.GetFolderPath
的第一个参数 方法。然后可以将其与带有Path.Combine
方法。
我还按照页面上的指示进行操作,这些指示告诉您确保将文件的“构建操作”设置为“ EmbeddedResource”。最终,我试图获取文件的路径/ URL,以便可以将其传递到File Handling in Xamarin.Forms的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中嵌入文件并稍后检索其文件路径?
答案 0 :(得分:0)
您需要将程序集嵌入式资源复制到临时文件中,以便MediaManager播放它。
使用Xamarin.Essentials
可以获取操作系统的缓存目录,然后将资源复制到该目录并通过file://
网址进行播放。
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段)segments肿,从而占用应用程序内存,导致加载时间降低等。基于本地捆绑/资产的文件,然后将其复制到缓存目录。您可以使用Xamarin.Essentials通过OpenAppPackageFileAsync
获取那些只读的捆绑/资产文件,然后使用该流将文件复制到缓存目录中。