我可以通过调用
将一个名为“test.mp3”的文件作为资源添加到我的pcl项目的“Resources \ Sounds \”文件夹中 AudioManager.Audio.Manager.PlaySound("test.mp3");
现在我正在尝试播放我从webapi服务下载的音频文件。我使用RestSharp库下载文件和PCLStorage库来存储文件:
try
{
var fileId = new Guid("test2");
IFolder rootFolder = FileSystem.Current.LocalStorage;
IFolder resources = await rootFolder.CreateFolderAsync("Resources", CreationCollisionOption.OpenIfExists);
IFolder soundsFolder = await rootFolder.CreateFolderAsync("Sounds", CreationCollisionOption.OpenIfExists);
IFile myFile = await soundsFolder.CreateFileAsync($"{fileId}.mp3", CreationCollisionOption.ReplaceExisting);
using (var stream = await myFile.OpenAsync(fileAccess: FileAccess.ReadAndWrite))
{
var request = new RestRequest($"{fileId}");
var client = new RestClient();
client.BaseUrl = new System.Uri("http://10.0.2.2/MyApp.WebApi/api/");
var bytes = client.DownloadData(request);
foreach (var myByte in bytes)
{
stream.WriteByte(myByte);
}
}
}
catch (Exception e)
{
}
我也尝试将文件保存到根目录但这也不起作用。
据我所知,文件似乎下载得很好(没有错误)。但是我还没有找到一种方法来通过在android模拟器上定位文件来验证这一点。我想我首先需要以某种方式安装Play商店,然后下载ES File explorer以查看android模拟器上的文件结构。
问题在于,当我尝试以与嵌入式资源相同的方式播放声音文件时,它将无法正常工作。
AudioManager.Audio.Manager.PlaySound("test2.mp3");
我想这是因为在编译时将嵌入式资源迁移到android模拟器上的“某处”所发生的魔力。 我的主要问题是我不明白使用什么路径
为了能够播放文件
答案 0 :(得分:1)
事实证明AudioManager库假定声音始终是Assets。 在它的NewSound method in the android code中,它尝试使用以下行构建AssetFileDescriptor:
Forms.Context.Assets.OpenFd(文件路径);
我想这个方法需要一个相对于assets文件夹的文件路径(对于已编译的资源),否则抛出一个FileNotFoundException。无论如何抛出此异常都没有在我的pcl代码中达到我的catch语句。 (它看起来像是在android - > pcl层中被吞噬了吗?)
现在我将SoundPool.LoadAsync与文件路径而不是AssetFileDescriptor一起使用,这解决了我的问题。
耶!