C# 如何在Xamarin.Forms中获取嵌入文件的URL/路径

C# 如何在Xamarin.Forms中获取嵌入文件的URL/路径,c#,android,ios,xamarin,xamarin.forms,C#,Android,Ios,Xamarin,Xamarin.forms,我无法访问Xamarin.Forms项目中嵌入的.mp4文件。根据文件,它说 每个平台上的文件路径都可以从.NET中确定 使用Environment.SpecialFolder 枚举作为环境的第一个参数。GetFolderPath 方法。然后可以将其与具有 路径。合并方法 我还遵循了页面上的说明,其中告诉您确保为文件将“构建操作”设置为“EmbeddedResource”。最后,我尝试获取文件的路径/url,以便将其传递到的CrossMediaManager.Current.Play()函数中。

我无法访问Xamarin.Forms项目中嵌入的.mp4文件。根据文件,它说

每个平台上的文件路径都可以从.NET中确定 使用
Environment.SpecialFolder
枚举作为
环境的第一个参数。GetFolderPath
方法。然后可以将其与具有
路径。合并
方法

我还遵循了页面上的说明,其中告诉您确保为文件将“构建操作”设置为“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文件位于一个名为“video”的文件夹中,该文件夹直接位于项目“Signing”中。我已尝试调整文件路径,使其仅为文件、文件和视频文件夹,并尝试使用“/”而不是“.”来分隔目录。我经常得到的打印输出是该文件不存在。在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中嵌入文件并在以后检索其文件路径?

您需要将程序集嵌入资源复制到临时文件,以便MediaManager播放它

使用
Xamarin.Essentials
可以获取操作系统的缓存目录,然后将资源复制到其中,并通过
文件://
url播放

例子:
注意:就我个人而言,我不会使用嵌入式资源,因为它们会使程序集(或本机库中的.text段)膨胀,从而消耗应用程序内存,导致加载时间变慢,等等,但我会使用基于本机包/资产的文件并将其复制到缓存目录。您可以使用Xamarin.Essentials通过
OpenAppPackageFileAsync
获取这些只读捆绑/资产文件,并使用该流将文件复制到缓存目录。

对于iOS,将文件包含在iOS项目的根目录中,将构建操作设置为Content,然后路径将为“file.ext”或“/file.ext”
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));