6

Ho un'app per radio Internet che utilizza BackgroundAudioPlayer.Timer in AudioPlaybackAgent

Ho bisogno di un timer nell'agente di riproduzione audio che aggiorni il titolo del brano in riproduzione del BAP estratto dall'API della stazione radio Internet.

L'aggiunta di un DispatcherTimer nella Riproduzione audio agente mi dà un'eccezione cross-thread, e l'utilizzo di:

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

non ha funzionato.

Ho bisogno del codice qui perché se inserisco il codice di aggiornamento nell'app stessa, quando l'utente si allontana dall'app si ferma (a differenza del comportamento di Windows 8).

Non è possibile utilizzare gli agenti pianificati poiché vengono eseguiti una sola volta ogni 30 minuti (IIRC).

È possibile o non è possibile farlo su Windows Phone?

risposta

-1

Avete considerato di aggiornare le informazioni nell'agente del lettore audio in background come indicato di seguito nel tag di traccia.

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

e quindi leggere quel tag nel front-end dalla vostra applicazione quando necessario?

0

Di seguito è un estratto dalla documentazione MSDN per Background Audio Player:

Invio di messaggi tra le attività: Ci sono momenti in cui si desidera comunicare tra i due processi di un'applicazione audio di sottofondo. Ad esempio, è possibile che l'attività in background notifichi l'attività in primo piano quando viene avviata una nuova traccia, quindi invia il nuovo titolo del brano all'attività in primo piano da visualizzare sullo schermo. Un semplice meccanismo di comunicazione solleva eventi sia nei processi in primo piano che in background. I metodi SendMessageToForeground e SendMessageToBackground richiamano ciascuno eventi nell'attività corrispondente. I dati possono essere passati come argomento al gestore eventi nell'attività di ricezione. Passa i dati utilizzando una nuova classe chiamata ValueSet. Questa classe è un dizionario che contiene una stringa come chiave e altri tipi di valori come valori. È possibile passare tipi di valori semplici come int, string, bool e così via.

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

Spero che questo aiuti!

+0

Questo non funzionerà per il problema elencato sopra. L'utente si allontana dall'applicazione in modo che il primo piano non sia disponibile per ricevere il messaggio. Io (e l'OP) sto cercando periodicamente (diciamo ogni 6 secondi) di eseguire qualche compito indipendentemente dall'interfaccia utente aperta mentre l'audio di sottofondo è in riproduzione. L'unico modo in cui io ora come farlo fino ad ora è implementare un Audio Streaming Agent. Voglio sapere se c'è un modo semplice. Grazie per il replay però. –

0

Ho trovato una domanda che potrebbe aiutare a: How to run a timer on background in windows phone 8?

quando si imposta un timer che sta controllando ogni x secondi se il "titolo" si differenzia da ultimo titolo noto allora si potrebbe inviare queste informazioni di nuovo esso.

Questo potrebbe essere il codice per il timer:

Dichiarare questi:

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

e impostare questo come Tick per il 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 */ 
      } 
     } 
    } 
} 

Ricorda: Change "yourAPI.GetTitleOfTrack () "- Funzione da questo con Function Call reale della tua API.