AudioPlaybackAgent中的定时器

时间:2013-12-08 11:22:33

标签: c# windows-phone-8 dispatchertimer background-agents background-audio

我有一个使用BackgroundAudioPlayer的互联网广播应用。

我需要音频播放代理中的一个计时器,它将更新从网络广播电台的API中提取的BAP当前播放曲目的曲目标题。

在音频播放代理中添加DispatcherTimer会给我一个跨线程异常,并使用:

Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                // Code
            });

没用。

我需要这里的代码,因为如果我将更新代码放在应用程序本身中,当用户离开应用程序时,更新会停止(与Windows 8的行为非常不同)。

我无法使用预定代理,因为它们每30分钟只运行一次(IIRC)。

这是可能的还是不能在Windows Phone上完成?

3 个答案:

答案 0 :(得分:0)

以下是背景音频播放器的MSDN文档摘录:

在任务之间发送消息: 有时您会想要在后台音频应用程序的两个进程之间进行通信。例如,您可能希望后台任务在新曲目开始播放时通知前台任务,然后将新歌曲标题发送到前台任务以在屏幕上显示。简单的通信机制会在前台和后台进程中引发事件。 SendMessageToForeground和SendMessageToBackground方法各自调用相应任务中的事件。数据可以作为参数传递给接收任务中的事件处理程序。使用名为ValueSet的新类传递数据。此类是一个字典,其中包含字符串作为键,其他值类型作为值。您可以传递简单的值类型,例如int,string,bool等。

https://msdn.microsoft.com/en-US/library/windows/apps/xaml/dn642090

希望这有帮助!

答案 1 :(得分:0)

我找到了一个可以帮助您的问题:How to run a timer on background in windows phone 8?

当你设置一个定时器,每隔x秒检查一次"标题"与上一个已知的标题不同,那么您可以将此信息发回给它。

这可能是计时器的代码:

声明这些:

string _newValue = string.Empty;
string _currentValue = string.Empty;
AudioTrack _tempTrack = null;

并将其设置为Timer的Tick

if (this.BackgroundAudioPlayer != null)
{
   if (this.BackgroundAudioPlayer.Instance != null)
   {
       if (this.BackgroundAudioPlayer.Instance.Track != null)
       {
           this._newValue= yourAPI.GetTitleOfTrack();

           try
           {
               /* First try to get the current Track as own Var */
               this._tempTrack = this.BackgroundAudioPlayer.Instance.Track;
               if (this._tempTrack != null)
               {
                  /* Then Read the .Tag Value from it, save to _currentValue */
                  if (this._tempTrack.Tag != null) 
                  { this._currentValue = this._tempTrack.Tag.ToString(); }
                  else
                  { this._currentValue = string.Empty; }

                  /* Compare */
                  if (this._currentValue != this._newValue)
                  {
                     /* Edit the Track Tag from your original BAP */
                     this.BackgroundAudioPlayer.Instance.Track.Tag = this._newValue;
                  }
               }
           }
           catch(Exception ex)
           {
               /* if something Crashes you can save the exception error for protocol */
           }
       }
   }
}

请记住:通过API的真实函数调用来更改" yourAPI.GetTitleOfTrack()" -Function。

答案 2 :(得分:-1)

您是否考虑过更新后台音频播放器代理中的信息,如下所示。

string newTag = "whatever you need to show";
AudioTrack track = BackgroundAudioPlayer.Instance.Track;
track.BeginEdit();
track.Tag = newTag;
track.EndEdit();

然后在需要时通过应用程序读取前端的标签?