首页 文章

在UWP App的不同页面中运行背景音频

提问于
浏览
1

我正在制作一个UWP应用程序,我在Button Click事件中在MainPage中运行Background Audio . 当我移动到另一个页面时,还有一个不同的媒体可以在后台音频任务中播放 .

如何停止当前播放的任务以运行另一个?我应该在全球定义什么吗?有关此问题的任何帮助?

Edit

我正在使用此示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BackgroundAudio当第一页的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();

但是新歌的运行时间超过了估计的时间并输入了此方法的其他内容:

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,但它不起作用 .

知道怎么让老歌停下来,当前的歌曲播放?

1 回答

  • 0

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

    从前台应用程序:

    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”可以是您应用程序中的全局常量 . 您可以使用ValueSet将实时流URL作为值传递给后台任务 .

相关问题