Получить фоновый звук воспроизведения позиции на остановке

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

}

Другие изменения состояния, происходящие, например, от буферизации или воспроизведения/паузы и т.д., Кажется, работают нормально, и я могу получить последнюю позицию, записанную для возможного последующего использования.

Однако, если и когда (во время запуска моего приложения в отладчике) я запускаю другое приложение, которое берет на себя фоновое устройство проигрывателя аудио в телефоне, первое (и последнее) событие в отладчике, которое я вижу, - это состояние воспроизведения

"Остановлено"

и сообщение об исключении

"Фоновые аудио ресурсы больше недоступны".

Есть ли что-то, что я мог бы сделать, чтобы заставить агента звукового проигрывателя сделать обычную позицию в ожидании "неграмотного" закрытия - или есть какой-то другой способ/событие для использования get и хранения позиции, предшествующей этому остановленному состоянию и недоступности фоновые аудио ресурсы?

Теги:
windows-phone-7
background-audio

1 ответ

0

Когда вы вызываете другого Игрока, ваш 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.

  • 0
    Спасибо, но у меня нет проблем с получением и сохранением позиции, когда все происходит в порядке. Но с помощью другого приложения, которое "захватывает" контроль над функцией фонового аудиоплеера в телефоне, мой собственный агент переходит из совершенно счастливого состояния "Проигрывает" в состояние "Остановлено" (где я больше не могу получить позицию) и, наконец, в "Выключение" (где я не могу получить положение больше). Исходя из этой темы stackoverflow.com/questions/9702935/… Возможно, мне придется принять это ограничение.
  • 0
    Понятно, значит, вы говорите, что когда вы вызываете другого игрока, ваш первый получает Стоп и невозможно получить его Position ? Если это так, я не уверен, что вы сможете сделать многое, так как это не зависит от вашего кода.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню