пауза звука в xamarin.forms C#

#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();
           }

        }