我有从console.log()
播放mp3
文件的代码。我虽然不知道当我致电path
时filePath
的价值是多少。
我存储的音频文件位于StartPlayer(String filePath)
和assets
文件夹中。但我不知道存储音频文件的最佳位置是什么?此外,我不知道如何从任一文件夹访问路径。
raw
感谢任何帮助。
答案 0 :(得分:1)
如果您将媒体文件添加为资源,则需要使用AssetManager
获取AssetFileDescriptor
。通过访问AssetManager
上的Assets属性(例如Android.App.Context
),可以获得Activity
的实例。因此,在Activity
子类中,您可以在else
子句中执行以下操作:
AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.mp3");
player = new MediaPlayer();
player.Reset();
player.SetDataSource(afd.FileDescriptor);
player.Prepare();
player.Start();
但是我必须说由于你的else
子句,你的音频不会第一次播放,当调用该方法时MediaPlayer为null时,该子句不会运行。似乎你应该这样做:
if (player == null)
{
player = new MediaPlayer();
}
AssetFileDescriptor afd = Assets.OpenFd("filenameinAssetsfolder.mp3");
player.Reset();
player.SetDataSource(afd.FileDescriptor);
player.Prepare();
player.Start();
有关AssetManager的更多信息:https://developer.xamarin.com/guides/android/application_fundamentals/resources_in_android/part_6_-_using_android_assets/
答案 1 :(得分:1)
您可以使用assets
和raw
文件夹存储将使用.APK编译的音频文件。
但是您应该重新考虑使用filePath
作为参数的策略。相反,请考虑使用string fileName
或int resource
。
要使用Android中的assets
无法从raw
或filePath
文件夹中检索文件。相反,这可以通过使用AsssetManager
或Resource
提及here来完成。
由于不需要else
子句,我还对您的代码进行了一些优化。
尝试从assets
文件夹访问文件时,您需要使用OpenFd
中的静态方法this.Assets
(其中this
是Context
你的Activity
)的文件名。这将返回AssetFileDescriptor
,您可以将其用作DataSource
,如下所示:
protected MediaPlayer player;
public void StartPlayer(string fileName)
{
if (player == null)
player = new MediaPlayer();
var fileDescriptor = Assets.OpenFd(filename);
player.Reset();
player.SetDataSource(fileDescriptor.FileDescriptor);
player.Prepare();
player.Start();
}
您也可以使用raw
文件夹,但要求您指向给定id
的自动生成的Resource
。这是使用Create
:
MediaPlayer
方法完成的
protected MediaPlayer player;
public void StartPlayer(int resource)
{
if (player == null)
player = MediaPlayer.Create(this, resource);
player.Reset();
player.Prepare();
player.Start();
}
其中resource
是指raw
文件夹中的音频文件,Resource.raw.youraudiofile
可以访问该文件(其中youraudiofile
是raw
中的音频名称1}}文件夹)。
您可以详细了解如何使用the Xamarin documentation中的raw
文件夹。