Xamarin Formsで音を再生する!
Xamarin Formsでオーディオ再生機能を作成するにはAndroid側の機能を使う必要があります。
前提
Xamarin Formsのプロジェクトの概要についてはこちらを。
DependecyService
Dependency Serviceの使い方についてはこちらを。
Interface
まずAndroid側を呼び出すためのInterfaceを実装します。
namespace DearFutureMe.Interface { public interface IAudio { void Play(string fileName); void Stop(); } }
Entiity
Android側の実装です。
using System; using Xamarin.Forms; using Android.Media; using DearFutureMe.Interface; using DearFutureMe.Droid; [assembly: Dependency(typeof(AudioEntity))] namespace DearFutureMe.Droid { public class AudioEntity : IAudio { public AudioEntity() { } MediaPlayer mediaPlayer = new MediaPlayer(); public void Play(string fileName) { var fd = global::Android.App.Application.Context.Assets.OpenFd(fileName); mediaPlayer.Prepared += (s, e) => { mediaPlayer.Start(); }; mediaPlayer.SetDataSource(fd.FileDescriptor, fd.StartOffset, fd.Length); mediaPlayer.Prepare(); } public void Stop() { try { if (mediaPlayer.IsPlaying) { mediaPlayer.Stop(); } } catch (Exception e) { e.ToString(); } } } }
Assets
再生するオーディオファイルはAndroid側のAssetsに保存してください。
ファイルを指定して再生する
いつも通りAboutPage.xaml.csのOnApearing()で画面表示時に動作するようにします。
protected override void OnAppearing() { base.OnAppearing(); var audio = DependencyService.Get(); audio.Play("sound_01.mp3"); }
以上でAssetsに保存したオーディオファイルの再生が出来ます。
ただしエミュレータ上だとだいぶラグがあります。
実機上ではほぼ同期に動きますが、その場合表示をバックグラウンド経由でやっている場合、ラグがあるので同一スレッド上で同期するように処理を合わせる必要があります。
コメント