C# 在UWP应用程序的不同页面中运行背景音频

C# 在UWP应用程序的不同页面中运行背景音频,c#,uwp,live-streaming,background-task,background-audio,C#,Uwp,Live Streaming,Background Task,Background Audio,我正在制作一个UWP应用程序,我在主页上的按钮点击事件中运行背景音频。当我移动到另一个页面时,还有一个不同的媒体可以在后台音频任务中播放 如何停止当前正在播放的任务以运行其他任务?我应该在全球范围内定义一些东西吗?关于这个问题有什么帮助吗 编辑 我正在使用此示例:当第一页的backgroundAudio运行时,我转到第二页,在单击事件中,我使用以下代码设置了一个新列表: // First update the persisted start track ApplicationSett

我正在制作一个UWP应用程序,我在主页上的按钮点击事件中运行背景音频。当我移动到另一个页面时,还有一个不同的媒体可以在后台音频任务中播放

如何停止当前正在播放的任务以运行其他任务?我应该在全球范围内定义一些东西吗?关于这个问题有什么帮助吗

编辑

我正在使用此示例:当第一页的backgroundAudio运行时,我转到第二页,在单击事件中,我使用以下代码设置了一个新列表:

   // First update the persisted start track
   ApplicationSettingsHelper.SaveSettingsValue(ApplicationSettingsConstants.TrackId, RadioFacade.mySongs[0].MediaUri.ToString()); //here
           ApplicationSettingsHelper.SaveSettingsValue(ApplicationSettingsConstants.Position, new TimeSpan().ToString());

                // Start task
                StartBackgroundAudioTask();
但新歌运行和输入此方法的else所需时间超过了预计时间:

private void StartBackgroundAudioTask()
        {
            AddMediaPlayerEventHandlers();

            var startResult = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                bool result = backgroundAudioTaskStarted.WaitOne(10000);
                //Send message to initiate playback
                if (result == true)
                {
                    MessageService.SendMessageToBackground(new UpdatePlaylistMessage(RadioFacade.mySongs));
                    MessageService.SendMessageToBackground(new StartPlaybackMessage());
                }
                else
                {
                    throw new Exception("Background Audio Task didn't start in expected time");
                }
            });
            startResult.Completed = new AsyncActionCompletedHandler(BackgroundTaskInitializationCompleted);
        }
那首老歌一直在播放

我试图使用
BackgroundMediaPlayer.Shutdown()
停止当前的BackgroundMediaPlayer,但没有成功


您知道如何停止播放旧歌曲并播放当前歌曲吗?

您可以通过从前台向后台媒体播放器发送消息来控制它。比如说,

从前台应用程序:

BackgroundMediaPlayer.SendMessageToBackground(new ValueSet
{
    {"playnew", "some value"}
});
在您的后台任务中:

public sealed class AudioPlayer : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground;
        ...
        ...
    }

    private async void BackgroundMediaPlayer_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e)
    {
        object value;
        if (e.Data.TryGetValue("playnew", out value) && value != null)
        {
            // value will be whatever you pass from the foreground.
            BackgroundMediaPlayer.Current.Pause();
            BackgroundMediaPlayer.Current.Source = stream source;
            BackgroundMediaPlayer.Current.Play();
        }
    }

    ...
}

“playnew”可以是应用程序中的全局常量。您可以使用值集将实时流url作为值传递给后台任务。

您可以通过从前台向后台媒体播放器发送消息来控制后台媒体播放器。比如说,

从前台应用程序:

BackgroundMediaPlayer.SendMessageToBackground(new ValueSet
{
    {"playnew", "some value"}
});
在您的后台任务中:

public sealed class AudioPlayer : IBackgroundTask
{
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground;
        ...
        ...
    }

    private async void BackgroundMediaPlayer_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e)
    {
        object value;
        if (e.Data.TryGetValue("playnew", out value) && value != null)
        {
            // value will be whatever you pass from the foreground.
            BackgroundMediaPlayer.Current.Pause();
            BackgroundMediaPlayer.Current.Source = stream source;
            BackgroundMediaPlayer.Current.Play();
        }
    }

    ...
}

“playnew”可以是应用程序中的全局常量。您可以使用该值集将直播流url作为值传递给后台任务。

您是否尝试过BackgroundMediaPlayer.Current.Pause()?是否尝试过BackgroundMediaPlayer.Current.Pause()?