我有一个使用BackgroundAudioPlayer
的互联网广播应用。
我需要音频播放代理中的一个计时器,它将更新从网络广播电台的API中提取的BAP当前播放曲目的曲目标题。
在音频播放代理中添加DispatcherTimer
会给我一个跨线程异常,并使用:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
// Code
});
没用。
我需要这里的代码,因为如果我将更新代码放在应用程序本身中,当用户离开应用程序时,更新会停止(与Windows 8的行为非常不同)。
我无法使用预定代理,因为它们每30分钟只运行一次(IIRC)。
这是可能的还是不能在Windows Phone上完成?
答案 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();
然后在需要时通过应用程序读取前端的标签?