6

Ich habe eine Internetradio-App, die BackgroundAudioPlayer verwendet.Timer in AudioPlaybackAgent

Ich brauche einen Timer im Audio Playback Agent, der den Titelnamen des aktuell abgespielten BAP-Tracks aktualisiert, der von der API der Internetradiosender abgerufen wird.

ein DispatcherTimer in den Audio-Wiedergabe-Agenten Hinzufügen gibt mir eine verkanten Ausnahme, und mit:

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

Hat nicht funktioniert.

Ich brauche den Code hier, denn wenn ich den Update-Code in der App selbst, wenn der Benutzer weg von der App navigiert die Updates stoppen (sehr im Gegensatz zu Windows 8 Verhalten).

Ich kann geplante Agenten nicht verwenden, da sie nur einmal alle 30 Minuten ausgeführt werden (IIRC).

Ist dies möglich oder kann dies nicht unter Windows Phone durchgeführt werden?

Antwort

-1

Haben Sie in Betracht gezogen, die Informationen im Hintergrund-Audioplayer-Agent wie unten im Track-Tag zu aktualisieren.

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

und dann dieses Tag im Frontend bei Bedarf von Ihrer Anwendung gelesen werden?

0

Im Folgenden ein Auszug aus der MSDN-Dokumentation für Hintergrund-Audio-Player:

Nachrichten zwischen Aufgaben Senden: Es gibt Zeiten, wenn Sie zwischen den beiden Prozessen eines Hintergrund-Audio App kommunizieren wollen. Beispielsweise möchten Sie, dass die Hintergrundaufgabe die Vordergrundaufgabe benachrichtigt, wenn ein neuer Titel abgespielt wird, und dann den neuen Titel an die Vordergrundaufgabe sendet, um sie auf dem Bildschirm anzuzeigen. Ein einfacher Kommunikationsmechanismus löst Ereignisse sowohl im Vordergrund- als auch im Hintergrundprozess aus. Die Methoden SendMessageToForeground und SendMessageToBackground rufen jeweils Ereignisse in der entsprechenden Aufgabe auf. Daten können als Argument an den Ereignishandler in der empfangenden Aufgabe übergeben werden. Übergeben Sie Daten mit einer neuen Klasse namens ValueSet. Diese Klasse ist ein Wörterbuch, das eine Zeichenfolge als Schlüssel und andere Werttypen als Werte enthält. Sie können einfache Werttypen wie int, string, bool usw. übergeben.

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

hoffe, das hilft!

+0

Dies funktioniert nicht für das oben genannte Problem. Der Benutzer navigiert von der Anwendung weg, sodass der Vordergrund nicht zum Empfangen der Nachricht verfügbar ist. Ich (und das OP) schaue regelmäßig (sagen wir alle 6 Sekunden) eine Aufgabe durch, unabhängig davon, ob die Benutzeroberfläche geöffnet ist, während das Hintergrundaudio abgespielt wird. Der einzige Weg, wie ich das jetzt mache, ist die Implementierung eines Audio-Streaming-Agenten. Ich möchte wissen, ob es einen leichten Weg gibt. Vielen Dank für Ihre Wiederholung. –

0

fand ich eine Frage, die Ihnen helfen könnten: How to run a timer on background in windows phone 8?

, wenn Sie einen Timer einstellen, von den letzten bekannten Titel alle x Sekunden, wenn der „Titel“ unterscheidet prüft dann könnte man diese Informationen, um es zurückschicken.

Dies könnte der Code für den Timer sein:

erklären diese:

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

und setzen diese als Tick für den 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 */ 
      } 
     } 
    } 
} 

Denken Sie daran: Change „yourAPI.GetTitleOfTrack () "- Funktion von diesem mit echtem Funktionsaufruf Ihrer API.