6

我有一個互聯網廣播應用程序,使用BackgroundAudioPlayer定時器在AudioPlaybackAgent

我需要一個音頻播放代理中的定時器,它將更新從互聯網廣播電臺的API拉出的BAP當前播放曲目的曲目標題。

添加DispatcherTimer到音頻回放代理給了我一個跨線程的異常,並使用:

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

沒有工作。

我需要在這裏的代碼,因爲如果我把更新代碼放在應用程序本身,當用戶從應用程序導航離開應用程序更新停止(非常不像Windows 8的行爲)。

我無法使用計劃代理,因爲它們每30分鐘只運行一次(IIRC)。

這是可能的,或者這可能不會在Windows Phone上完成?

回答

-1

您是否考慮過在音軌標籤中更新後臺音頻播放器代理中的信息如下所示。

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

然後在需要時通過應用程序在前端讀取該標籤?

0

下面是從MSDN文檔背景音頻播放器的摘錄:

發送任務之間的消息: 有些時候,你會希望有一個背景音頻應用程序的兩個進程之間的通信。例如,您可能希望後臺任務在新軌道開始播放時通知前臺任務,然後將新歌曲標題發送到前臺任務以顯示在屏幕上。簡單的通信機制引發前臺和後臺進程中的事件。 SendMessageToForeground和SendMessageToBackground方法分別調用相應任務中的事件。數據可以作爲參數傳遞給接收任務中的事件處理程序。使用名爲ValueSet的新類傳遞數據。這個類是一個字典,它包含一個字符串作爲鍵和其他值類型作爲值。您可以傳遞簡單的值類型,如int,string,bool等。

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

希望這有助於!

+0

這不適用於上面列出的問題。用戶從應用程序導航離開,因此前臺無法接收消息。我(和OP)希望定期(假設每6秒鐘)執行一些任務,無論在播放背景音頻時UI是否打開。我現在如何做到這一點的唯一方法是實現音頻流媒體代理。我想知道是否有簡單的方法。 謝謝您的重播。 –

0

我發現了一個問題,它可以幫助你:How to run a timer on background in windows phone 8?

當你設置這是每x秒檢查一個計時器,如果「標題」從最後一個已知的標題不同,那麼你可以發送此信息回去吧。

這可能是代碼的計時器:

這些聲明:

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

並將此蜱的定時器

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函數。