Таймер в AudioPlaybackAgent

У меня есть приложение интернет-радио, которое использует BackgroundAudioPlayer.

Мне нужен таймер в агенте воспроизведения аудио, который будет обновлять название дорожки воспроизводимой в данный момент дорожки BAP, извлеченной из API интернет-радиостанции.

Добавление DispatcherTimer в агент воспроизведения аудио дает мне перекрестное исключение и использование:

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

Не работает.

Мне нужен код здесь, потому что, если я помещу код обновления в само приложение, когда пользователь выйдет из приложения, обновления остановятся (во многом в отличие от поведения Windows 8).

Я не могу использовать запланированных агентов, так как они запускаются только один раз каждые 30 минут (IIRC).

Это возможно или нельзя сделать на Windows Phone?


person ReignOfComputer    schedule 08.12.2013    source источник


Ответы (3)


Ниже приведен отрывок из документации MSDN для фонового аудиоплеера:

Отправка сообщений между задачами. Бывают случаи, когда вам нужно обмениваться данными между двумя процессами фонового аудиоприложения. Например, вы можете захотеть, чтобы фоновая задача уведомляла задачу переднего плана, когда начинается воспроизведение новой дорожки, а затем отправляла название новой песни задаче переднего плана для отображения на экране. Простой механизм связи вызывает события как в приоритетных, так и в фоновых процессах. Каждый из методов SendMessageToForeground и SendMessageToBackground вызывает события в соответствующей задаче. Данные могут быть переданы в качестве аргумента обработчику событий в принимающей задаче. Передавайте данные, используя новый класс ValueSet. Этот класс представляет собой словарь, содержащий строку в качестве ключа и другие типы значений в качестве значений. Вы можете передавать простые типы значений, такие как int, string, bool и т. д.

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

Надеюсь это поможет!

person CodeNoob    schedule 05.01.2016
comment
Это не будет работать для проблемы, указанной выше. Пользователь выходит из приложения, поэтому передний план недоступен для получения сообщения. Я (и ОП) хочу периодически (скажем, каждые 6 секунд) выполнять какую-то задачу независимо от того, открыт пользовательский интерфейс во время воспроизведения фонового звука. Единственный способ, которым я могу это сделать, — это реализовать агент потоковой передачи аудио. Я хочу знать, есть ли простой способ. Тем не менее, спасибо за ваш повтор. - person Chris Gonzales; 07.01.2016

Я нашел вопрос, который может вам помочь: Как запустить таймер в фоновом режиме в Windows Phone 8?

когда вы устанавливаете таймер, который проверяет каждые x секунд, отличается ли «заголовок» от последнего известного заголовка, вы можете отправить ему эту информацию.

Это может быть код для таймера:

Объявите это:

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

и установите это как 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 */
           }
       }
   }
}

Помните: измените функцию «yourAPI.GetTitleOfTrack()» на настоящий вызов функции вашего API.

person Daniel Alexander Karr    schedule 08.01.2016

Рассматривали ли вы возможность обновления информации в агенте фонового аудиоплеера, как показано ниже в теге дорожки.

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

а затем читать этот тег в интерфейсе вашего приложения, когда это необходимо?

person juhariis    schedule 11.06.2014