Xamarin.Forms Android端如何检测是否有后台音频正在播放
Xamarin.Forms Android 端后台音频播放状态检测方案
Android 平台可通过系统内置的AudioManager服务实现检测,无需额外引入第三方依赖,具体实现方案如下:
核心检测逻辑
Android 系统从API Level 9(Android 2.3)开始提供IsMusicActive属性,可直接判断当前是否有音频处于播放状态,Xamarin.Android 中调用代码如下:
// 获取系统音频服务实例 var audioManager = (AudioManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.AudioService); // 检测是否有其他音频正在播放 bool hasPlayingAudio = audioManager?.IsMusicActive ?? false;
跨平台封装方案
你可以将双端的检测逻辑封装为Xamarin.Forms依赖服务,方便公共层统一调用:
公共层定义接口
在Xamarin.Forms共享项目中新增音频服务接口:
public interface IAudioPlaybackDetector { bool IsOtherAudioPlaying(); }
iOS端实现
直接复用你现有的AVAudioSession逻辑即可:
[assembly: Dependency(typeof(AudioPlaybackDetector_iOS))] namespace YourAppName.iOS { public class AudioPlaybackDetector_iOS : IAudioPlaybackDetector { public bool IsOtherAudioPlaying() { return AVAudioSession.SharedInstance().OtherAudioPlaying; } } }
Android端实现
封装刚才的AudioManager检测逻辑:
[assembly: Dependency(typeof(AudioPlaybackDetector_Android))] namespace YourAppName.Droid { public class AudioPlaybackDetector_Android : IAudioPlaybackDetector { public bool IsOtherAudioPlaying() { var audioManager = (AudioManager)Android.App.Application.Context.GetSystemService(Android.Content.Context.AudioService); return audioManager?.IsMusicActive ?? false; } } }
公共层调用
在需要检测音频状态的地方直接调用依赖服务即可:
var detector = DependencyService.Get<IAudioPlaybackDetector>(); bool isBackgroundAudioPlaying = detector.IsOtherAudioPlaying(); // 后续可根据该值决定是否跳过音效播放、降低音效音量或请求音频焦点
可选优化
如果你的应用适配Android 12及以上版本,可以额外注册AudioManager.AudioPlaybackCallback监听音频播放状态变化,无需主动轮询检测,性能表现更好。
建议搭配平台音频焦点机制使用:播放应用内音效前先请求音频焦点,系统会自动压低或暂停后台音频,播放结束后释放焦点,更符合系统交互规范。
内容的提问来源于stack exchange,提问作者Bijington
相关产品推荐
相关产品推荐

