如何检测Windows 10 UWP环境下其他应用的后台音频播放状态?
解决UWP SDK检测第三方音乐应用播放状态的方案
我完全懂你的痛点——BackgroundMediaPlayer.IsMediaPlaying()确实有很大局限性,尤其是面对网页版流媒体或者没采用UWP官方媒体框架的应用时,完全起不到作用。别担心,我有个更可靠的方案,用Windows 10引入的GlobalSystemMediaTransportControls API就能搞定这个问题。
为什么BackgroundMediaPlayer.IsMediaPlaying()失效?
这个方法只针对那些使用UWP官方BackgroundMediaPlayer框架开发的应用,而网页版Pandora(依托浏览器的原生媒体播放)、部分第三方音乐应用(比如亚马逊音乐可能用了自定义播放逻辑)根本不会被它检测到。而GlobalSystemMediaTransportControlsSessionManager是系统级的媒体会话管理器,能覆盖所有类型的媒体播放场景——不管是UWP应用、桌面应用,还是浏览器里的网页媒体。
具体实现步骤
1. 获取媒体会话管理器实例
首先需要异步获取管理器实例,注意要在UI线程执行(或通过Dispatcher调度):
using Windows.Media.Control; async Task<GlobalSystemMediaTransportControlsSessionManager> GetSessionManagerAsync() { return await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); }
2. 检测目标应用的播放状态
拿到管理器后,遍历所有活跃媒体会话,结合应用ID和媒体属性判断是否是目标应用在播放:
async Task<bool> IsTargetMusicAppPlayingAsync() { var sessionManager = await GetSessionManagerAsync(); if (sessionManager == null) return false; // 目标应用的AppUserModelId示例,可根据实际版本调整 var targetAppIds = new List<string> { "SpotifyAB.SpotifyMusic_zpdnekdrzrea0!App", // Spotify UWP应用 "Amazon.com.AmazonMusic_3.0.0.0_x64__1e100q00000", // 亚马逊音乐UWP应用 "Microsoft.MicrosoftEdge_8wekyb3d8bbwe!MicrosoftEdge", // Edge浏览器(网页版Pandora) "Google.Chrome_8wekyb3d8bbwe!Chrome" // Chrome浏览器(网页版Pandora) }; foreach (var session in sessionManager.GetSessions()) { var playbackInfo = session.GetPlaybackInfo(); // 先检查会话是否处于播放状态 if (playbackInfo.PlaybackStatus == GlobalSystemMediaTransportControlsSessionPlaybackStatus.Playing) { // 匹配目标应用ID if (targetAppIds.Contains(session.SourceAppUserModelId)) { // 针对网页会话,额外验证媒体内容是否来自Pandora var mediaProps = await session.TryGetMediaPropertiesAsync(); if (mediaProps != null && mediaProps.DisplayName.Contains("Pandora", StringComparison.OrdinalIgnoreCase)) { return true; } // UWP应用直接匹配ID即可 return true; } } } return false; }
3. 实时监听播放状态变化
如果需要实时响应播放状态的切换(比如用户中途打开/关闭音乐应用),可以订阅会话变化事件:
async void SetupMediaSessionListener() { var sessionManager = await GetSessionManagerAsync(); if (sessionManager == null) return; sessionManager.SessionsChanged += SessionManager_SessionsChanged; } private async void SessionManager_SessionsChanged(GlobalSystemMediaTransportControlsSessionManager sender, SessionsChangedEventArgs args) { bool isTargetPlaying = await IsTargetMusicAppPlayingAsync(); if (isTargetPlaying) { // 执行SDK静音逻辑 MuteSdkAudio(); } else { // 恢复SDK声音 UnmuteSdkAudio(); } }
注意事项
- 版本兼容性:这个API仅支持Windows 10 1703(Build 15063)及以上版本,如果你的SDK需要兼容更早系统,可以保留
BackgroundMediaPlayer作为降级备选方案。 - 网页媒体的精准检测:网页版Pandora的会话归属浏览器,所以需要通过媒体标题、艺术家等属性进一步验证,避免误判浏览器内的其他媒体播放(比如YouTube视频)。
- 权限说明:无需额外声明特殊权限,正常打包的UWP应用即可直接使用该API。
内容的提问来源于stack exchange,提问作者Greg Thatcher
相关产品推荐
相关产品推荐

