MediaPlayer类中的SetDataSource用于从Assets或raw文件夹加载mp3文件

时间:2017-01-04 21:05:09

标签: c# android xamarin xamarin.android

我有从console.log()播放mp3文件的代码。我虽然不知道当我致电pathfilePath的价值是多少。

我存储的音频文件位于StartPlayer(String filePath)assets文件夹中。但我不知道存储音频文件的最佳位置是什么?此外,我不知道如何从任一文件夹访问路径。

raw

感谢任何帮助。

2 个答案:

答案 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)

您可以使用assetsraw文件夹存储将使用.APK编译的音频文件。

但是您应该重新考虑使用filePath作为参数的策略。相反,请考虑使用string fileNameint resource

要使用Android中的assets无法从rawfilePath文件夹中检索文件。相反,这可以通过使用AsssetManagerResource提及here来完成。

由于不需要else子句,我还对您的代码进行了一些优化。

资产文件夹

尝试从assets文件夹访问文件时,您需要使用OpenFd中的静态方法this.Assets(其中thisContext你的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可以访问该文件(其中youraudiofileraw中的音频名称1}}文件夹)。

您可以详细了解如何使用the Xamarin documentation中的raw文件夹。