#audio #xamarin.forms
#Аудио #xamarin.forms
Вопрос:
Итак, я создаю приложение с использованием xamarin.forms, которое должно воспроизводить и управлять звуком. В настоящее время мой аудиофайл воспроизводится как на Android, так и на iOS, НО я не могу заставить работать другие элементы управления, такие как .Pause() и .Stop()
Воспроизведение звука работает в обоих примерах.
Заранее благодарю вас!
Вот мой код для каждой платформы
Android:
using System;
using Xamarin.Forms;
using AudioPlayEx.Droid;
using AudioToolbox;
using Android.Media;
using Android.Content.Res;
using Android.OS;
using Android;
[assembly: Dependency(typeof(AudioService))]
namespace AudioPlayEx.Droid
{
public class AudioService : IAudio
{
public AudioService()
{
}
MediaPlayer player;
public void PlayAudioFile(string fileName)
{
var player = new MediaPlayer();
var fd = Android.App.Application.Context.Assets.OpenFd(fileName);
player.Prepared = (s, e) =>
{
player.Start();
};
player.SetDataSource(fd.FileDescriptor, fd.StartOffset, fd.Length);
player.Prepare();
}
protected MediaPlayer playme;
public void PauseAudioFile(String fileName)
{
var player = new MediaPlayer();
var fd = Android.App.Application.Context.Assets.OpenFd(fileName);
player.Prepared = (s, e) =>
{
player.Pause();
};
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();
}
public void PauseAudioFile(string fileName)
{
string sFilePath = NSBundle.MainBundle.PathForResource(Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
var url = NSUrl.FromString(sFilePath);
var _player = AVAudioPlayer.FromUrl(url);
_player.Pause();
}
}
}
Ответ №1:
Я думаю, вам нужно сохранить ваш экземпляр AVAudioPlayer в переменную и вызвать pause для этого объекта. Прямо сейчас вы создаете новый AVAudioPlayer и вызываете для него pause, который ничего не делает. Я добавил код iOS, чтобы показать, что я имею в виду. Android должен быть похожим.
iOS:
public class AudioService : IAudio
{
AVAudioPlayer _player;
public void PlayAudioFile(string fileName)
{
string sFilePath = NSBundle.MainBundle.PathForResource(Path.GetFileNameWithoutExtension(fileName), Path.GetExtension(fileName));
var url = NSUrl.FromString(sFilePath);
_player = AVAudioPlayer.FromUrl(url);
_player.FinishedPlaying = (object sender, AVStatusEventArgs e) => {
_player = null;
};
_player.Play();
}
public void PauseAudioFile(string fileName)
{
_player.Pause();
}
}
Ответ №2:
Эта тема старая, но я сделал это именно так:
MediaPlayer player;
public void PlayAudioFile(string fileName, string ONOF)
{
if (ONOF == "OFF")
{
player.Stop();
}
if (ONOF == "ON")
{
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();
}
}