1

我需要存储背景音频播放位置,以防另一个应用程序启动并接管背景音频播放器设施。

我在我的音频播放器代理中使用了以下内容

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();

}

来自例如缓冲或播放/暂停等事件的其他状态更改似乎工作正常,我能够获取记录的最新位置以供以后使用。

但是,如果以及何时(在调试器中运行我的应用程序时)我启动另一个应用程序来接管手机中的后台音频播放器设施,我可以看到的调试器中的第一个(也是最后一个)事件是播放状态

“停止”

和异常消息

“背景音频资源不再可用。”

我可以做些什么来强制后台音频播放器代理定期保存位置以预期“非正常”关闭 - 或者是否有其他方式/事件可以使用获取和存储停止状态和不可用之前的位置背景音频资源?

4

1 回答 1

0

当您调用其他Player时,您的正在存在Shutdown(因为只能有一个 BAP 实例)并且其资源将不可用 - 这就是您丢失_pos. 要在实例之间保存它,您必须使用文件或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

于 2014-06-11T05:58:54.477 回答