[英]Pause background service in Xamarin.Forms
我有一個應用程序偶爾會通過系統文本到語音 (TTS) 系統說話,但如果有后台服務(如有聲讀物或音樂流)同時運行,它們會重疊。 我想暫停媒體,播放我的 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
}
在 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.