在UWP中在后台播放音频的最简单方法是什么?

Fla*_*der 2 c# windows background-audio win-universal-app

我正在我的Project(一个soundcloud客户端)上工作,该应用程序可以正常播放曲目,但是在最小化该应用程序时不能播放。我使用MediaElement-Object从URL播放mp3。当应用程序处于后台时,如何强制音乐继续播放音乐。或者,最简单的方法/最好的解释性教程是实现这一目标的方法。我搜寻了很多好的答案,但是我发现那些答案对我来说太好了:D意思是说,我不理解。

Sta*_*mos 5

要在后台播放音频,您将需要Package.appxmanifest为后台任务进行声明,启用音频并添加一个入口点(如TestUWP.MainPagepage)。

在此处输入图片说明

另外,为了使用户能够轻松管理音频,可以使用SystemMediaTransportControls

这是“播放”和“暂停”的基本设置。

a

<MediaElement x:Name="mediaElement" Height="100" Width="100" AreTransportControlsEnabled="True"/>
Run Code Online (Sandbox Code Playgroud)

C#

public MainPage()
{
    this.InitializeComponent();

    systemControls = SystemMediaTransportControls.GetForCurrentView();

    // Register to handle the following system transpot control buttons.
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    mediaElement.CurrentStateChanged += MediaElement_CurrentStateChanged;


    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}

private void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (mediaElement.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}



void SystemControls_ButtonPressed(SystemMediaTransportControls sender, SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        case SystemMediaTransportControlsButton.Stop:
            StopMedia();
            break;
        default:
            break;
    }
}

private async void StopMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        mediaElement.Stop();
    });
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        if (mediaElement.CurrentState == MediaElementState.Playing)
            mediaElement.Pause();
        else
            mediaElement.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        mediaElement.Pause();
    });
}
Run Code Online (Sandbox Code Playgroud)

输出量

输出量

如果您想启用更多控件,则可以使用ex的可用属性。

systemControls.IsNextEnabled = true;

并且您必须case在按钮开关中添加。

case SystemMediaTransportControlsButton.Next:
                    //handle next song
                    break;
Run Code Online (Sandbox Code Playgroud)

  • 编辑:解决问题,因为我将MediaElement的AudioCategory-Property设置为BackgroundCapableMedia。感谢您的回答,您为我节省了很多工作! (2认同)
  • 编辑2:它适用于PC,但不适用于移动电话:/ (2认同)