コメント
コメントの投稿
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。
namespace AppName.Services
{
//DependencyServiceから利用する
public interface IAudioService
{
void Play(string filePath);
bool IsPlaying { get; }
void Stop();
void Pause();
}
}
using System;
using Android.Media;
using Android.Content.Res;
using Xamarin.Forms;
using AppName.Droid.Services;
using AppName.Services;
[assembly: Dependency(typeof(AudioService))]
namespace AppName.Droid.Services
{
public class AudioService : IAudioService
{
private static MediaPlayer _player = null;
private static bool _isPausing = false;
//再生
public void Play(string filePath)
{
if (String.IsNullOrEmpty(filePath))
{
return;
}
if (_player == null ||
!_isPausing)
{
_player = new MediaPlayer();
AssetFileDescriptor afd = null;
if (!filePath.Contains("/"))
{
//Assetから取得する場合
afd = global::Android.App.Application.Context.Assets.OpenFd(filePath);
_player.SetDataSource(afd.FileDescriptor, afd.StartOffset, afd.Length);
}
else
{
//ファイルパスから取得する場合
Android.Net.Uri uri = Android.Net.Uri.Parse("file://" + filePath);
_player.SetDataSource(Forms.Context, uri);
}
_player.Prepared += (s, e) =>
{
_player.Start();
};
_player.Prepare();
}
else
{
_player.Start();
_isPausing = false;
}
}
//再生中かどうか判定する
public bool IsPlaying
{
get
{
if (_player == null)
{
return false;
}
return _player.IsPlaying;
}
}
//再生を終了する
public void Stop()
{
if (_player == null)
{
return;
}
_player.Stop();
}
//再生を中断する
public void Pause()
{
if (_player == null)
{
return;
}
_player.Pause();
_isPausing = true;
}
}
}
using System;
using System.IO;
using Foundation;
using AVFoundation;
using Xamarin.Forms;
using AppName.iOS.Services;
using AppName.Services;
[assembly: Dependency(typeof(AudioService))]
namespace AppName.iOS.Services
{
public class AudioService : IAudioService
{
private static AVAudioPlayer _player = null;
private static bool _isPausing = false;
//再生
public void Play(string filePath)
{
if (String.IsNullOrEmpty(filePath))
{
return;
}
if (_player == null ||
!_isPausing)
{
if (!filePath.Contains("/"))
{
//リソースから取得する場合
filePath = NSBundle.MainBundle.PathForResource(
Path.GetFileNameWithoutExtension(filePath),
Path.GetExtension(filePath));
}
var url = NSUrl.FromFilename(filePath);
_player = AVAudioPlayer.FromUrl(url);
_player.FinishedPlaying += (object sender, AVStatusEventArgs e) =>
{
_player = null;
};
}
_player.Play();
_isPausing = false;
}
//再生中かどうか判定する
public bool IsPlaying
{
get
{
if (_player == null)
{
return false;
}
return _player.Playing;
}
}
//再生を終了する
public void Stop()
{
if (_player == null)
{
return;
}
_player.Stop();
}
//再生を中断する
public void Pause()
{
if (_player == null)
{
return;
}
_player.Pause();
_isPausing = true;
}
}
}
using AppName.Services;
using Xamarin.Forms;
public class TestPage : ContentPage
{
void OnPlayClick(object sender, EventArgs e)
{
if (!DependencyService.Get<IAudioService>().IsPlaying)
{
DependencyService.Get<IAudioService>().Play("Music.wav");
this.btnPlay.Text = "Pause";
}
else
{
DependencyService.Get<IAudioService>().Pause();
this.btnPlay.Text = "Play";
}
}
void OnStopClick(object sender, EventArgs e)
{
DependencyService.Get<IAudioService>().Stop();
}
}
※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。
入力されていないコメントには返信しませんのであらかじめご了承くださいませ。