Informations
Le sujet que vous avez demandé est indiqué ci-dessous. Toutefois, ce sujet ne figure pas dans la bibliothèque.

Comment utiliser les contrôles de transport de média système (XAML)

Applies to Windows and Windows Phone

La classe SystemMediaTransportControls permet à votre application d’utiliser les contrôles de transport de média système fournis par Windows et de mettre à jour les informations de média qui sont affichées.

Pour voir cette fonctionnalité en action dans un exemple de lecture de média complet, voir Lecture de contenu multimédia de A à Z.

Introduction

La classe SystemMediaTransportControls introduite dans Windows 8.1 remplace l’ancienne classe MediaControl. Vous devez utiliser la nouvelle classe SystemMediaTransportControls à la place de MediaControl.

Les contrôles de transport système sont différents des contrôles de transport de l’objet MediaElement. Les contrôles de transport système sont les contrôles qui s’affichent quand l’utilisateur appuie sur une touche de média matériel, telle que la commande de volume d’un casque ou les boutons de média d’un clavier. Si l’utilisateur appuie sur la touche Pause d’un clavier et que votre application prend en charge la classe SystemMediaTransportControls, votre application reçoit une notification et vous pouvez effectuer l’action appropriée.

Votre application peut également mettre à jour les informations sur un média, telles que le titre de la chanson et l’image miniature affichée par SystemMediaTransportControls.

Installer les contrôles de transport

Pour obtenir une instance de la classe SystemMediaTransportControls, appelez GetForCurrentView.

Pour activer les boutons que votre application doit gérer, définissez la propriété « is enabled » tels que IsPlayEnabled, IsPauseEnabled, IsNextEnabled et IsPreviousEnabled au niveau de l’objet SystemMediaTransportControls. Voir la documentation de référence de SystemMediaTransportControls pour obtenir la liste complète.

Le code ci-dessous crée un objet MediaElement et installe la classe SystemMediaTransportControls. Il active les boutons de lecture et de mise en pause et ajoute un gestionnaire d’événements pour l’événement ButtonPressed. Les gestionnaires d’événements pour MediaOpened et CurrentStateChanged sont présentés plus loin dans cet exemple.


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}


Communiquer avec les contrôles de transport

Lors de l’utilisation des contrôles de transport, les phases de communication sont au nombre de trois :

La classe SystemMediaTransportControls notifie votre application par le biais de l’événement ButtonPressed quand l’utilisateur appuie sur l’un des boutons activés. Votre application peut alors contrôler le média (p.ex., mise en pause ou lecture) en réponse au bouton actionné.

Votre application notifie SystemMediaTransportControls via la propriété PlaybackStatus dès lors que l’état du média a changé. Cela permet aux contrôles de transport de mettre à jour l’état des boutons de sorte qu’il corresponde à l’état de la source du média.

Vous pouvez mettre à jour les informations du média affichées par les contrôles de transport, telles que le titre de la chanson ou la pochette de l’album, grâce à SystemMediaTransportControlsDisplayUpdater.

Gérer les boutons actionnés

L’événement ButtonPressed est déclenché par les contrôles de transport système quand l’utilisateur appuie sur l’un des boutons activés. La propriété Button de SystemMediaTransportControlsButtonPressedEventArgs indique sur quel bouton l’utilisateur a appuyé.

Pour mettre à jour les objets du thread d’interface utilisateur à partir du gestionnaire d’événements ButtonPressed, tel qu’un objet MediaElement, vous devez marshaler les appels via CoreDispatcher. Cela s’explique par le fait que le gestionnaire d’événements ButtonPressed n’est pas appelé à partir du thread d’interface utilisateur. De plus, seul le thread d’interface utilisateur peut modifier les objets qu’il contient. Si vous essayez de modifier des objets d’interface utilisateur à partir d’un autre thread que le thread d’interface utilisateur, une exception est levée. L’exemple de code ci-dessous montre comment procéder.

Voici le code qui crée un gestionnaire d’événements ButtonPressed et des méthodes d’assistance pour lire et mettre en pause l’objet MediaElement. Notez que les appels à Play et Pause sont marshalés sur le thread d’interface utilisateur via CoreDispatcher en utilisant Dispatcher.RunAsync.


void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}


Mettre à jour l’état du média

Pour notifier SystemMediaTransportControls que l’état du média a changé, affectez à PlaybackStatus la valeur de MediaPlaybackStatus appropriée.

Il est tout indiqué de gérer la notification de mise à jour dans l’événement CurrentStateChanged de l’objet MediaElement, qui se déclenche dès lors que l’état du média change.

Voici du code qui gère le gestionnaire d’événements CurrentStateChanged et qui met à jour la propriété PlaybackStatus de la classe SystemMediaTransportControls.


void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}


Mettre à jour les informations et la miniature du média

Utilisez la classe SystemMediaTransportControlsDisplayUpdater pour mettre à jour les informations du média affichées par les contrôles de transport, telles que le titre de la chanson ou la pochette de l’album.

La propriété DisplayUpdater est la classe SystemMediaTransportControlsDisplayUpdater associée à la classe SystemMediaTransportControls.

Vous pouvez mettre à jour les métadonnées manuellement en définissant les propriétés du média au niveau de MusicProperties, ImageProperties ou VideoProperties. Il est toutefois recommandé et beaucoup plus facile de passer le fichier multimédia à la méthode CopyFromFileAsync qui extrait automatiquement les métadonnées et l’image miniature à partir du fichier.

Une fois que vous avez défini toutes les informations du média à afficher, appelez Update. L’interface utilisateur n’est pas mise à jour tant que la méthode Update n’est pas appelée.

Windows.Storage.StorageFile et Windows.Storage.Streams.RandomAccessStreamReference proposent des méthodes statiques fort utiles lorsqu’il s’agit de travailler sur les informations de média.

StorageFile

RandomAccessStreamReference

Le code ci-dessous met à jour les métadonnées de chanson d’un fichier de musique et met à jour l’image miniature. Le gestionnaire d’événements MediaOpened est utilisé pour appeler la méthode d’assistance en vue d’amorcer la mise à jour. Cet exemple est codé en dur dans les fichiers multimédias incorporés dans l’application. Dans une application réelle, il est fort probable que vous obtiendriez les fichiers multimédias sur le réseau ou le système de fichiers local. Dans ce cas, GetFileFromPathAsync, CreateFromStream et CreateFromFile peuvent s’avérer plus utiles pour obtenir les objets de fichier et de flux.


async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}


Voici du code qui montre comment mettre à jour manuellement les métadonnées et la miniature.


/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


Contenu audio en arrière-plan

Pour lire du contenu audio en arrière-plan, une application doit activer les boutons de lecture et de mise en pause en affectant à IsPlayEnabled et IsPauseEnabled la valeur true. L’application doit également gérer l’événement ButtonPressed. Pour obtenir des informations sur toutes les conditions à remplir pour pouvoir lire du contenu audio en arrière-plan, voir Comment lire du contenu audio en arrière-plan.

Code complet

Voici le code complet de tous les extraits de code de cette rubrique.


<MediaElement x:Name="musicPlayer" 
              Source="Music/music1.mp3"
              CurrentStateChanged="MusicPlayer_CurrentStateChanged"
              MediaOpened="MusicPlayer_MediaOpened"/>



SystemMediaTransportControls systemControls;

public MainPage()
{
    this.InitializeComponent();

    // Hook up app to system transport controls.
    systemControls = SystemMediaTransportControls.GetForCurrentView();
    systemControls.ButtonPressed += SystemControls_ButtonPressed;

    // Register to handle the following system transpot control buttons.
    systemControls.IsPlayEnabled = true;
    systemControls.IsPauseEnabled = true;
}

void MusicPlayer_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (musicPlayer.CurrentState)
    {
        case MediaElementState.Playing:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            systemControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

void SystemControls_ButtonPressed(SystemMediaTransportControls sender, 
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            PlayMedia();
            break;
        case SystemMediaTransportControlsButton.Pause:
            PauseMedia();
            break;
        default:
            break;
    }
}

async void PlayMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Play();
    });
}

async void PauseMedia()
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        musicPlayer.Pause();
    });
}

async private void UpdateSongInfo()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Get the music file and pass it to CopyFromFileAsync to extract the metadata
    // and thumbnail. StorageFile is defined in Windows.Storage
    StorageFile musicFile =
        await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Music/music1.mp3"));
    
    await updater.CopyFromFileAsync(MediaPlaybackType.Music, musicFile);

    // Update the system media transport controls
    updater.Update();
}

void MusicPlayer_MediaOpened(object sender, RoutedEventArgs e)
{
    UpdateSongInfo();
}
/// <summary>
/// Shows how to update the media metadata and thumbnail manually.
/// Normally you would probably retreive this info from a source such as a database
/// but for this simple sample we'll just set the metadata with strings.
/// </summary>
void UpdateSongInfoManually()
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemControls.DisplayUpdater;

    // Music metadata.
    updater.MusicProperties.AlbumArtist = "artist";
    updater.MusicProperties.AlbumArtist = "album artist";
    updater.MusicProperties.Title = "song title";

    // Set the album art thumbnail.
    // RandomAccessStreamReference is defined in Windows.Storage.Streams
    updater.Thumbnail =
       RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

    // Update the system media transport controls.
    updater.Update();
}


Rubriques associées

Exemple d’utilisation de SystemMediaTransportControls
Comment lire du contenu audio en arrière-plan
Démarrage rapide : vidéo et audio
Lecture de contenu multimédia de A à Z

 

 

Afficher:
© 2015 Microsoft