使用GSMTCSM遇API访问及权限拒绝问题求助
解决方案
一、控制台应用启用Windows.Media API访问
调整项目TargetFramework
打开项目文件(.csproj),将TargetFramework修改为带Windows版本的TFM(以Windows 10 20H2及以上版本为例):<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>同时添加启用Windows Runtime支持的属性:
<EnableWindowsRuntimeSupport>true</EnableWindowsRuntimeSupport>安装匹配版本的SDK.Contracts
卸载现有Microsoft.Windows.SDK.Contracts包,安装与TargetFramework版本对应的包。比如针对Windows 10 19041,安装10.0.19041.1版本,可通过NuGet包管理器或以下命令完成:Install-Package Microsoft.Windows.SDK.Contracts -Version 10.0.19041.1完成后即可在控制台项目中正常引用
Windows.Media.Control命名空间。
二、UWP应用解决UnauthorizedAccessException
添加受限能力声明
打开Package.appxmanifest,先在根元素添加rescap命名空间:<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" IgnorableNamespaces="uap mp rescap">再在
<Capabilities>节点下添加全局媒体控制的受限能力:<Capabilities> <rescap:Capability Name="globalMediaControl" /> <!-- 保留已添加的musicLibrary等权限 --> </Capabilities>改用异步调用方式
避免使用.Wait()阻塞线程,改用await异步调用:var manager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync();
三、非UWP实现完整示例(控制台)
以下是读取音频会话信息、控制播放的可运行代码:
using Windows.Media.Control; class Program { static async Task Main(string[] args) { // 获取会话管理器 var sessionManager = await GlobalSystemMediaTransportControlsSessionManager.RequestAsync(); // 监听会话切换事件 sessionManager.SessionChanged += SessionManager_SessionChanged; // 获取当前活跃会话并过滤浏览器 var activeSession = sessionManager.GetCurrentSession(); if (activeSession != null && !IsBrowserSession(activeSession)) { await PrintSessionDetails(activeSession); // 示例:执行暂停操作 await activeSession.TryPauseAsync(); } Console.WriteLine("按任意键退出..."); Console.ReadKey(); } // 判断是否为浏览器会话 private static bool IsBrowserSession(GlobalSystemMediaTransportControlsSession session) { var appId = session.SourceAppUserModelId; return appId.Contains("chrome") || appId.Contains("edge") || appId.Contains("firefox"); } // 打印会话媒体信息 private static async Task PrintSessionDetails(GlobalSystemMediaTransportControlsSession session) { var mediaProps = await session.TryGetMediaPropertiesAsync(); if (mediaProps != null) { Console.WriteLine($"标题: {mediaProps.Title}"); Console.WriteLine($"艺术家: {mediaProps.Artist}"); Console.WriteLine($"专辑: {mediaProps.AlbumTitle}"); } Console.WriteLine($"播放状态: {session.GetPlaybackInfo().PlaybackStatus}"); } // 会话切换时触发的逻辑 private static async void SessionManager_SessionChanged(GlobalSystemMediaTransportControlsSessionManager sender, SessionChangedEventArgs args) { var newSession = args.Session; if (newSession != null && !IsBrowserSession(newSession)) { Console.WriteLine("\n检测到新的活跃音频会话:"); await PrintSessionDetails(newSession); } } }
四、备选方案
如果GSMTCSM配置仍有问题,可使用AudioSwitcher.AudioApi.CoreAudio库枚举音频会话,但该库无法直接获取媒体元数据(标题、艺术家),仍需结合GSMTCSM实现完整功能。
内容的提问来源于stack exchange,提问作者JuzioMiecio520
相关产品推荐
相关产品推荐

