Android 暂停Xamarin.Forms中的后台服务

Android 暂停Xamarin.Forms中的后台服务,android,xamarin.forms,Android,Xamarin.forms,我有一个应用程序,偶尔会通过系统文本到speechTTS系统说话,但是如果有后台服务,比如有声读物,或者音乐流同时运行,它们就会重叠。 我想暂停媒体,播放我的TTS,然后取消媒体暂停。我看过了,但找不到任何解决办法 我相信如果我从我的应用程序中播放实际的音频,如果我正确理解了我的发现,它会暂停媒体直到我的播放完成。但TTS似乎没有同样的效果。演讲完全是动态的,所以我不能只记录所有的选项 使用最新的Xamarin.Forms,我查看了我能找到的所有媒体nuget包,它们似乎都非常专注于从文件控制媒

我有一个应用程序,偶尔会通过系统文本到speechTTS系统说话,但是如果有后台服务,比如有声读物,或者音乐流同时运行,它们就会重叠。 我想暂停媒体,播放我的TTS,然后取消媒体暂停。我看过了,但找不到任何解决办法

我相信如果我从我的应用程序中播放实际的音频,如果我正确理解了我的发现,它会暂停媒体直到我的播放完成。但TTS似乎没有同样的效果。演讲完全是动态的,所以我不能只记录所有的选项

使用最新的Xamarin.Forms,我查看了我能找到的所有媒体nuget包,它们似乎都非常专注于从文件控制媒体

我唯一不喜欢它的潜在想法是,可能在TTS运行时播放一个空的音频文件。但如果存在的话,我希望有一个更优雅的解决方案


我现在不在乎iOS,所以如果它是一个只有android的解决方案,我可以接受。如果是本机java/kotlin,我可以将其转换/合并。

同意rbonestell的说法,您可以使用DependencyService和AudioFocus来实现它,当您录制音频时,您可以在PCL中创建接口

   public interface IControl
{
   void StopBackgroundMusic();
}
录制音频时,可以使用以下代码执行DependencyService

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

多亏了Leon Lu-MSFT,我才能走上正确的方向。我采用了他的实现,其中包含一些不推荐的对Android API的调用,并根据我的需要对其进行了更新

我会做更多的工作来确保它的稳定性和功能性。我还要看看能不能把它清理一下。但我的第一次测试是这样的:

[程序集:媒体服务的依赖类型] 命名空间…Droid.Services { 公共类媒体服务:IMediaService 公共异步任务PauseBackgroundMusicForTaskFunc onFocus已授予 { var manager=AudioManagerAndroid.App.Application.Context.GetSystemServiceContext.AudioService; var builder=新的AudioFocusRequestClass.BuilderAudioFocus.GainTransientMayDuck; var focusRequest=builder.Build; var ret=manager.RequestAudioFocusfocusRequest; 如果ret==AudioFocusRequest { 等待OnFocusPermited?调用; manager.focusrequest focusrequest; } } } }
我相信你正在寻找的是管理音频焦点:我不知道如何最好地将其与TTS结合起来,但希望这能为你指明正确的方向!我计划今晚晚些时候更仔细地研究这个问题,但您是否立即知道AudioManager是否允许我从原始应用程序重新开始播放音频?这个功能的目标是让TTS告诉我在过去的一小段时间里我走了多远/多快,但如果我在听一本书/一首歌,它只会通过其他音频说话。我想暂停它,做TTS,然后取消音频。看起来这个解决方案只处理暂停?再一次,今晚晚些时候我会更仔细地看,我感谢你的回答!从这篇文章来看,似乎有可能放弃关注,我希望这意味着从以前的音频管理器重新开始。将尝试与您一起走这条路线。再次感谢你的回答!如果我能让它发挥作用,我就接受它。
[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();
        }
    }
}