2015-12-13 103 views
6

我正在使用Xamarin.forms爲Android,iOS和Windows Phone創建應用程序。我的問題是如何發揮與Xamarin形式的MP3或WAV?如何在Xamarin.forms上播放聲音?

我的業務邏輯是由Shared Project處理的,我不知道如何專門使用平臺「MediaPlayer」。

回答

3

我剛剛完成了創建Xamarin日的AudioManager適用於iOS,Android,UWP,Windows 8.1和Windows Phone 8.1。如果您有興趣,請登錄https://github.com/jcphlux/XamarinAudioManager。有一個指向Nuget包的鏈接,或者可以隨意克隆該項目。

5

現在Xamarin.forms還沒有健全的API,所以你需要使用DependencyService 檢查下面的鏈接,這是對我工作的罰款:

https://www.codeproject.com/Articles/1088094/Playing-audio-mp-File-in-Xamarin-Forms

我們需要創建一個界面,將平臺特定的項目來實現,我把它命名爲IAudio.cs出於同樣的代碼如下:

using System; 
    namespace AudioPlayEx 
    { 
    public interface IAudio 
     { 
      void PlayAudioFile(string fileName); 
     } 
    } 

Android解決方案:

using System; 
    using Xamarin.Forms; 
    using AudioPlayEx.Droid; 
    using Android.Media; 
    using Android.Content.Res; 

    [assembly: Dependency(typeof(AudioService))] 
    namespace AudioPlayEx.Droid 
    { 
     public class AudioService: IAudio 
     { 
      public AudioService() 
      { 
      } 

      public void PlayAudioFile(string fileName){ 
       var player = new MediaPlayer(); 
       var fd = global::Android.App.Application.Context.Assets.OpenFd(fileName); 
       player.Prepared += (s, e) => 
       { 
        player.Start(); 
       }; 
       player.SetDataSource(fd.FileDescriptor,fd.StartOffset,fd.Length); 
       player.Prepare(); 
      } 
     } 
} 

iOS的解決方案:

using System; 
using Xamarin.Forms; 
using AudioPlayEx; 
using AudioPlayEx.iOS; 
using System.IO; 
using Foundation; 
using AVFoundation; 

[assembly: Dependency (typeof (AudioService))] 
namespace AudioPlayEx.iOS 
{ 
    public class AudioService : IAudio 
    { 
     public AudioService() 
     { 
     } 

     public void PlayAudioFile(string fileName) 
     { 
      string sFilePath = NSBundle.MainBundle.PathForResource 
      (Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName)); 
      var url = NSUrl.FromString (sFilePath); 
      var _player = AVAudioPlayer.FromUrl(url); 
      _player.FinishedPlaying += (object sender, AVStatusEventArgs e) => { 
       _player = null; 
      }; 
      _player.Play(); 
     } 
    } 
} 

最後,我們會以播放音頻文件,使用下面的代碼在我們的PCL /共享的項目。

DependencyService.Get<IAudio>().PlayAudioFile("MySong.mp3"); 
+0

測試和工作。優秀的文檔在這裏:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/dependency-service/introduction/ – pollaris

2

你可能會給Xam.Plugin.SimpleAudioPlayer一個嘗試,因爲Xamarin.Forms沒有良好的API。

簡而言之,將NuGet包添加到您希望支持的每個平臺特定項目。將音頻文件複製到適用於Windows UWP和Android的Assets文件夾,並將構建操作分別設爲ContentAndroid Asset。對於iOS的音頻文件複製到資源文件夾,並生成操作設置爲BundleResource,然後播放文件,像這樣:

var player = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current; 
player.Load("intro_sound.mp3"); 
player.Play();