如何在Xamarin.Forms

时间:2018-10-03 20:37:39

标签: c# android ios xamarin xamarin.forms

我无法访问Xamarin.Forms项目中嵌入的.mp4文件。根据{{​​3}}文档说,

  

每个平台上文件的路径都可以通过.NET确定   标准库使用Environment.SpecialFolder的值   枚举作为Environment.GetFolderPath的第一个参数   方法。然后可以将其与带有   Path.Combine方法。

我还按照页面上的指示进行操作,这些指示告诉您确保将文件的“构建操作”设置为“ EmbeddedResource”。最终,我试图获取文件的路径/ URL,以便可以将其传递到File Handling in Xamarin.FormsCrossMediaManager.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 个答案:

答案 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获取那些只读的捆绑/资产文件,然后使用该流将文件复制到缓存目录中。