2016-05-31 2 views
1

Je crée une application UWP dans laquelle j'exécute l'arrière-plan audio dans MainPage sur un événement Click Button. Lorsque je passe à une autre page, il y a également un média différent à lire dans la tâche d'arrière-plan audio. Comment puis-je arrêter la tâche en cours pour exécuter l'autre? Devrais-je définir quelque chose globalement? Toute aide concernant ce problème?Exécution de l'arrière-plan audio dans différentes pages de l'application UWP

Modifier

J'utilise cet exemple: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BackgroundAudio Alors que le backgroundAudio de la première page est en cours d'exécution, je vais à la deuxième page et un événement click je mis une nouvelle liste avec le code suivant:

// First update the persisted start track 
    ApplicationSettingsHelper.SaveSettingsValue(ApplicationSettingsConstants.TrackId, RadioFacade.mySongs[0].MediaUri.ToString()); //here 
      ApplicationSettingsHelper.SaveSettingsValue(ApplicationSettingsConstants.Position, new TimeSpan().ToString()); 

       // Start task 
       StartBackgroundAudioTask(); 

Mais la nouvelle chanson prend plus le temps estimé pour courir et entrer dans l'autre de cette méthode:

private void StartBackgroundAudioTask() 
     { 
      AddMediaPlayerEventHandlers(); 

      var startResult = this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       bool result = backgroundAudioTaskStarted.WaitOne(10000); 
       //Send message to initiate playback 
       if (result == true) 
       { 
        MessageService.SendMessageToBackground(new UpdatePlaylistMessage(RadioFacade.mySongs)); 
        MessageService.SendMessageToBackground(new StartPlaybackMessage()); 
       } 
       else 
       { 
        throw new Exception("Background Audio Task didn't start in expected time"); 
       } 
      }); 
      startResult.Completed = new AsyncActionCompletedHandler(BackgroundTaskInitializationCompleted); 
     } 

et la vieille chanson (première lecture) continue à jouer.

J'ai essayé d'arrêter le BackgroundMediaPlayer actuel en utilisant BackgroundMediaPLayer.Shutdown() mais cela n'a pas fonctionné.

Une idée de comment laisser l'ancienne chanson s'arrêter et la chanson en cours de lecture?

+0

Avez-vous essayé BackgroundMediaPlayer.Current.Pause() à la place? – H77

Répondre

0

Vous pouvez contrôler le lecteur multimédia en arrière-plan en lui envoyant des messages à partir du premier plan. Par exemple,

Depuis l'application de premier plan:

BackgroundMediaPlayer.SendMessageToBackground(new ValueSet 
{ 
    {"playnew", "some value"} 
}); 

Dans votre tâche de fond:

public sealed class AudioPlayer : IBackgroundTask 
{ 
    public void Run(IBackgroundTaskInstance taskInstance) 
    { 
     BackgroundMediaPlayer.MessageReceivedFromForeground += BackgroundMediaPlayer_MessageReceivedFromForeground; 
     ... 
     ... 
    } 

    private async void BackgroundMediaPlayer_MessageReceivedFromForeground(object sender, MediaPlayerDataReceivedEventArgs e) 
    { 
     object value; 
     if (e.Data.TryGetValue("playnew", out value) && value != null) 
     { 
      // value will be whatever you pass from the foreground. 
      BackgroundMediaPlayer.Current.Pause(); 
      BackgroundMediaPlayer.Current.Source = stream source; 
      BackgroundMediaPlayer.Current.Play(); 
     } 
    } 

    ... 
} 

"regarderNew" peut être une constante globale dans votre application. Vous pouvez utiliser ValueSet pour transmettre l'URL du flux en direct à la tâche d'arrière-plan en tant que valeur.