【问题标题】:(UWP) How to activate the "Taskbar Miniplayer" like in Groove(UWP) 如何像 Groove 一样激活“任务栏迷你播放器”
【发布时间】:2024-01-18 10:48:01
【问题描述】:

我为我的应用程序使用 BackgroundMediaPlayer 在后台播放音频。现在我看到了这些按钮:

如何激活它们?

【问题讨论】:

    标签: background media-player uwp windows-10-universal


    【解决方案1】:

    为了使任务栏中的媒体控件正常工作,您需要从前台应用程序和后台任务加载和配置 SystemMediaTransportControls。如果您仅从后台任务执行此操作,则会显示控件,但它们将保持禁用状态。

    在您的前台应用程序中,您应该有以下代码:

    var smtc = SystemMediaTransportControls.GetForCurrentView();
    smtc.ButtonPressed += smtc_ButtonPressed;
    smtc.PropertyChanged += smtc_PropertyChanged;
    smtc.IsEnabled = true;
    smtc.IsPauseEnabled = true;
    smtc.IsPlayEnabled = true;
    smtc.IsNextEnabled = true;
    smtc.IsPreviousEnabled = true;
    

    在后台任务中,你应该有:

    smtc = BackgroundMediaPlayer.Current.SystemMediaTransportControls;
    smtc.ButtonPressed += smtc_ButtonPressed;
    smtc.PropertyChanged += smtc_PropertyChanged;
    smtc.IsEnabled = true;
    smtc.IsPauseEnabled = true;
    smtc.IsPlayEnabled = true;
    smtc.IsNextEnabled = true;
    smtc.IsPreviousEnabled = true;
    

    注意获取控件实例的API不一样:
    SystemMediaTransportControls.GetForCurrentView() 在前台应用中,BackgroundMediaPlayer.Current.SystemMediaTransportControls 在后台任务中。

    你将不得不支持两个(前景+背景)中的按钮按下事件

    【讨论】:

    • 嗨,这种方法在背景音频的 2 进程模型中仍然有效吗?因为在我的情况下,即使音频继续播放,当应用程序进入后台时,系统播放器控件也不起作用。在为背景音频启动一个流程模型后,我们是否需要更改任何内容。 ps-考虑我无法将我的整个应用程序从 2 进程模型切换到单进程模型。 感谢帮助
    • 这应该仍然有效。两个流程模型已被弃用,但仍在工作。您应该分享您所做的工作以进一步调查。有一些很好的解释here
    【解决方案2】:

    那是System Media Transport Controls,您应该添加代码来处理点击事件。
    这是官方示例:

    public MainPage()
    {
    this.InitializeComponent();
    
    // Hook up app to system transport controls.
    systemMediaControls = SystemMediaTransportControls.GetForCurrentView();
    systemMediaControls.ButtonPressed += SystemControls_ButtonPressed;
    
    // Register to handle the following system transpot control buttons.
    systemMediaControls.IsPlayEnabled = true;
    systemMediaControls.IsPauseEnabled = true;
    }
    
    async void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
    SystemMediaTransportControlsButtonPressedEventArgs args)
    {
    switch (args.Button)
      {
        case SystemMediaTransportControlsButton.Play:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaElement.Play();
            });
            break;
        case SystemMediaTransportControlsButton.Pause:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaElement.Pause();
            });
            break;
        default:
            break;
      }
    }
    

    【讨论】: