Android SDK の MediaPlayer
は、公式ドキュメント に説明があるように、再生の状態をイベントで通知するので、 再生 → onCompletion
を受信 → 次の曲を再生… となるでしょう。
C# だと、「なんらかのイベントを受信するまで待つ」を、TaskCompletionSource
で簡単に非同期メソッド(Task<T>
を返すメソッド)にできるので便利です。それを使うと、以下のようになるでしょう。
ここでは、Completion
イベントを受信したら true
を、Error
イベントを受信したら false
を返す非同期メソッド PlayAsync
を定義します。これを await
を付けて呼び出せば、「再生が終了したら次の行へ」になるので、音声ファイル数分ループするだけです。
csharp
1//using Android.App;
2//using Android.Widget;
3//using Android.OS;
4//using Android.Media;
5//using System.Threading.Tasks;
6
7public class MainActivity : Activity
8{
9 protected override void OnCreate(Bundle savedInstanceState)
10 {
11 base.OnCreate(savedInstanceState);
12 SetContentView(Resource.Layout.Main);
13 var button = FindViewById<Button>(Resource.Id.myButton);
14
15 var sounds = new int[]
16 {
17 Resource.Raw.trumpet1,
18 Resource.Raw.trumpet2
19 };
20
21 button.Click += async (sender, e) =>
22 {
23 foreach (var id in sounds)
24 {
25 await PlayAsync(id);
26 }
27 };
28 }
29
30 // 再生が終了したら true を、エラーだったら false を返す
31 private Task<bool> PlayAsync(int rscId)
32 {
33 var compSource = new TaskCompletionSource<bool>();
34 var mp = MediaPlayer.Create(this, rscId);
35
36 mp.Completion += (_, __) =>
37 {
38 compSource.SetResult(true);
39 };
40
41 mp.Error += (_, __) =>
42 {
43 compSource.SetResult(false);
44 };
45
46 mp.Start();
47 return compSource.Task;
48 }
49}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/28 04:55 編集
2018/03/28 07:48