我需要存储背景音频播放位置以防其他应用程序启动并接管后台音频播放器设施。
我在音频播放器代理中使用了以下内容
protected override void OnPlayStateChanged(BackgroundAudioPlayer _player, AudioTrack _track, PlayState _playState)
{
System.Diagnostics.Debug.WriteLine(_playState.ToString());
double _pos = -1;
try
{
_pos = _player.Position.TotalSeconds;
}
catch (Exception _ex)
{
System.Diagnostics.Debug.WriteLine(_ex.Message);
}
switch (_playState)
{
// handling of different state changes
}
myStorePositionRoutine(_pos)
NotifyComplete();
}
其他状态变化来自例如缓冲或播放/暂停等事件似乎工作正常,我能够记录最新的位置,以备日后使用。
但是,如果(当在调试器中运行我的应用程序时)我启动另一个应用程序来接管手机中的后台音频播放器工具,我可以看到调试器中的第一个(和最后一个)事件是播放状态
"停止"
和异常消息
"后台音频资源不再可用。"
我是否可以做些什么来强制后台音频播放器代理人进行常规的位置保存,以期待一个非优雅的"关闭 - 还是有其他方式/事件使用获取并存储停止状态之前的位置和背景音频资源不可用?
答案 0 :(得分:0)
当您调用其他播放器时,您的Shutdown
正在_pos
(因为只有一个BAP实例)并且其资源将无法使用 - 这就是您失去{的原因{1}}。要在实例之间保存,您必须使用文件或IsolatedStorageSettings
。您可以在每次用户停止播放时或仅在调用Shutdown
时保存。示例代码如下所示:
private static double _pos = 0;
protected override void OnPlayStateChanged(BackgroundAudioPlayer player, AudioTrack track, PlayState playState)
{
switch (playState)
{
case PlayState.Shutdown:
IsolatedStorageSettings IS = IsolatedStorageSettings.ApplicationSettings;
if (IS.Contains("position")) IS["position"] = _pos;
else IS.Add("position", _pos);
IS.Save(); // remember to save
// rest of the code
// And somewhere where you want to bring your position back (for example when your BAP starts):
// to retrive the position:
IsolatedStorageSettings IS = IsolatedStorageSettings.ApplicationSettings;
if (IS.Contains("position")) _pos = (double)IS["position"];
else _pos = 0;
// rest of the code
并使_pos
静态和OnPlayStateChanged
之外,OnUserAction
也可以使用。