6

Mam aplikację radia internetowego, która używa BackgroundAudioPlayer.Licznik czasu w AudioPlaybackAgent

Potrzebuję timera w odtwarzaczu odtwarzania audio, który zaktualizuje tytuł utworu aktualnie odtwarzanego utworu BAP, który jest pobierany z interfejsu API internetowej stacji radiowej.

Dodawanie DispatcherTimer do odtwarzania audio Agenta daje mi wyjątek przekroju gwintu, a przy użyciu:

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

nie działa.

Potrzebuję kodu tutaj, ponieważ jeśli umieściłem kod aktualizacji w samej aplikacji, gdy użytkownik nawiguje z dala od aplikacji, aktualizacje zatrzymują się (w dużym stopniu w przeciwieństwie do zachowania Windows 8).

Nie mogę korzystać z Zaplanowanych agentów, ponieważ działają one tylko raz na 30 minut (IIRC).

Czy to możliwe, czy nie można tego zrobić w systemie Windows Phone?

Odpowiedz

-1

Czy rozważałeś zaktualizowanie informacji w tle odtwarzacza audio odtwarzacza, jak pokazano poniżej w tagu ścieżki.

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

a następnie odczytywanie tego znacznika z przodu aplikacji?

0

Poniżej znajduje się wyciąg z dokumentacji MSDN dla tła odtwarzacza audio:

Wysyłanie wiadomości między zadaniami: Są chwile, kiedy będziemy chcieli, aby komunikować się między tymi dwoma procesami app tła dźwiękowego. Na przykład możesz chcieć, aby zadanie w tle powiadamiało zadanie pierwszego planu, gdy rozpocznie się odtwarzanie nowego utworu, a następnie wyśle ​​tytuł nowej piosenki do zadania pierwszoplanowego do wyświetlenia na ekranie. Prosty mechanizm komunikacji podnosi zdarzenia zarówno w tle, jak i w tle. Metody SendMessageToForeground i SendMessageToBackground wywołują zdarzenia w odpowiednim zadaniu. Dane mogą być przekazywane jako argument do obsługi zdarzenia w zadaniu odbierającym. Przekaż dane za pomocą nowej klasy o nazwie ValueSet. Ta klasa jest słownikiem zawierającym ciąg znaków jako klucz i inne typy wartości jako wartości. Możesz przekazywać proste typy wartości, takie jak int, string, bool i tak dalej.

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

Nadzieja to pomaga!

+0

Nie zadziała w przypadku problemu wymienionego powyżej. Użytkownik przechodzi od aplikacji, więc pierwszy plan nie jest dostępny do odebrania wiadomości. Ja (i OP) staram się okresowo (powiedzmy co 6 sekund) wykonać pewne zadanie, niezależnie od tego, czy interfejs jest otwarty podczas odtwarzania dźwięku tła. Jedynym sposobem, jak to teraz zrobić, jest wdrożenie Audio Streaming Agent. Chcę wiedzieć, czy jest łatwy sposób. Dziękujemy za powtórkę. –

0

znalazłem pytanie, które mogłyby pomóc: How to run a timer on background in windows phone 8?

kiedy ustawić timer, który jest sprawdzanie co x sekund jeśli „tytuł” ​​różni się od ostatniego znanego tytułu, a następnie można przesłać te informacje z powrotem do niego.

To może być kod dla czasowy:

Stwierdzenie te:

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

i ustawić to jako Tick dla Timer

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 */ 
      } 
     } 
    } 
} 

Pamiętaj: Zmiana „yourAPI.GetTitleOfTrack () "- Funkcja z tego z rzeczywistym wywołaniem funkcji twojego API.