簡體   English   中英

MediaPlayer類中的SetDataSource從資產或原始文件夾加載mp3文件

[英]SetDataSource in MediaPlayer class to load up an mp3 file from Assets or raw folder

我有從path播放mp3文件的代碼。 我雖然不知道調用StartPlayer(String filePath)filePath的值是什么。

我存儲的音頻文件位於assetsraw文件夾中。 但是我不知道存儲音頻文件的最佳位置是什么? 另外,我不確定如何從任何一個文件夾訪問路徑。

protected MediaPlayer player;

public void StartPlayer(String  filePath)
{
  if (player == null) {
    player = new MediaPlayer();
  } else {
    player.Reset();
    player.SetDataSource(filePath);
    player.Prepare();
    player.Start();
  }
}

任何幫助表示贊賞。

如果將媒體文件添加為資產,則需要使用AssetManager來獲取AssetFileDescriptor 通過訪問Android.App.Context上的Assets屬性(例如Activity ,可以使用AssetManager的實例。 因此,在“ 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/

您可以同時使用assetsraw文件夾來存儲將用.APK編譯的音頻文件。

但是您應該重新考慮使用filePath作為參數的策略。 相反,請考慮使用string fileNameint resource

assetsraw文件夾中檢索文件無法使用Android中的filePath完成。 相反,這是通過使用做AsssetManager或通過Resource提到這里

我還優化了您的代碼,因為不需要else子句。

資產文件夾

當試圖從訪問文件assets的文件夾,您需要使用靜態方法OpenFdthis.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文件夾,盡管該文件夾要求您指向給定Resource的自動生成的id 這是使用MediaPlayer的靜態Create方法完成的:

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文件夾中的音頻文件的名稱)訪問。

您可以在Xamarin文檔中閱讀有關使用raw文件夾的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM