簡體   English   中英

在 Xamarin.Forms 中暫停后台服務

[英]Pause background service in Xamarin.Forms

我有一個應用程序偶爾會通過系統文本到語音 (TTS) 系統說話,但如果有后台服務(如有聲讀物或音樂流)同時運行,它們會重疊。 我想暫停媒體,播放我的 TTS,然后取消暫停媒體。 我已經看過了,但找不到任何解決方案。

我相信如果我要從我的應用程序播放實際音頻,它會暫停媒體,直到我的播放完成(如果我理解我找到的內容是正確的)。 但 TTS 似乎沒有同樣的影響。 演講是完全動態的,所以我不能只記錄所有選項。

使用最新的 Xamarin.Forms,我查看了我能找到的所有媒體 nuget 包,它們似乎都集中在從文件控制媒體上。

我唯一可能的想法(我不喜歡)是在 TTS 運行時播放一個空的音頻文件。 但是如果存在的話,希望有一個更優雅的解決方案。

(我目前不關心 iOS,所以如果它是一個僅限 android 的解決方案,我可以接受。如果它是原生的(java/kotlin),我可以轉換/合並它。)

同意rbonestell的說法,可以使用DependencyServiceAudioFocus來實現,錄制音頻時,可以在PCL中創建接口。

   public interface IControl
{
   void StopBackgroundMusic();
}

錄制音頻時,您可以使用以下代碼執行DependencyService

 private void Button_Clicked(object sender, EventArgs e)
    {
        DependencyService.Get<IControl>().StopBackgroundMusic();
       //record the audio
    }

在 android 文件夾中,您可以創建一個StopMusicService來實現這一點。

[assembly: Dependency(typeof(StopMusicService))]
namespace TTSDemo.Droid
{
  public  class StopMusicService : IControl
    {
        AudioManager audioMan;
        AudioManager.IOnAudioFocusChangeListener listener;


        public void StopBackgroundMusic()
        {

            audioMan = (AudioManager)Android.App.Application.Context.GetSystemService(Context.AudioService);
            listener = new MyAudioListener(this);
            var ret = audioMan.RequestAudioFocus(listener, Stream.Music, AudioFocus.Gain);

        }
    }

    internal class MyAudioListener :Java.Lang.Object, AudioManager.IOnAudioFocusChangeListener
    {
        private StopMusicService stopMusicService;

        public MyAudioListener(StopMusicService stopMusicService)
        {
            this.stopMusicService = stopMusicService;
        }

        public void OnAudioFocusChange([GeneratedEnum] AudioFocus focusChange)
        {
          //  throw new NotImplementedException();
        }
    }
}

感謝 Leon Lu - MSFT,我得以朝着正確的方向前進。 我采用了他的實現(其中有一些不推薦使用的 Android API 調用),並根據我的需要對其進行了更新。

我將做更多的工作以確保它穩定且功能強大。 我也看看能不能稍微清理一下。 但這是我第一次測試的效果:

[assembly: Dependency(typeof(MediaService))]
namespace ...Droid.Services
{
    public class MediaService : IMediaService
        public async Task PauseBackgroundMusicForTask(Func<Task> onFocusGranted)
        {
            var manager = (AudioManager)Android.App.Application.Context.GetSystemService(Context.AudioService);
            var builder = new AudioFocusRequestClass.Builder(AudioFocus.GainTransientMayDuck);
            var focusRequest = builder.Build();
            var ret = manager.RequestAudioFocus(focusRequest);
            if (ret == AudioFocusRequest.Granted)
            {
                await onFocusGranted?.Invoke();
                manager.AbandonAudioFocusRequest(focusRequest);
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM