Intégration avec les contrôles de transport de média systèmeIntegrate with the System Media Transport Controls

Cet article vous explique comment interagir avec les contrôles de transport de média système.This article shows you how to interact with the System Media Transport Controls (SMTC). Il s’agit d’un ensemble de contrôles communs à l’ensemble des appareils Windows 10 et qui octroient aux utilisateurs un moyen simple de contrôler la lecture des éléments multimédias pour les applications exécutées qui recourent à MediaPlayer pour la lecture.The SMTC is a set of controls that are common to all Windows 10 devices and that provide a consistent way for users to control media playback for all running apps that use MediaPlayer for playback.

Les contrôles de transport des médias système permettent aux développeurs d’applications multimédias de s’intégrer à l’interface utilisateur du système intégrée pour afficher les métadonnées du média, telles que l’artiste, le titre de l’album ou le titre du chapitre.The System Media Transport Controls enable media application developers integrate with the built-in system UI to display media metadata such as artist, album title, or chapter title. Le contrôle de transport du système permet également à un utilisateur de contrôler la lecture d’une application multimédia à l’aide de l’interface utilisateur système intégrée, telle que la suspension de la lecture et l’ignorance et l’arrière dans une sélection.The system transport control also allows a user to control the playback of a media app using the built-in system UI, such as pausing playback and skipping forward and backward in a playlist.

System Media Transtport Controls

Pour obtenir un exemple complet illustrant l’intégration avec les contrôles de transport de média système, consultez l’exemple de contrôle de transport de média système sur github.For a complete sample that demonstrates integration with the SMTC, see System Media Tranport Controls sample on github.

Intégration automatique avec les contrôles de transport de média systèmeAutomatic integration with SMTC

À partir de Windows 10, version 1607, les applications UWP qui utilisent la classe MediaPlayer pour lire le contenu multimédia sont automatiquement intégrées par défaut avec les contrôles de transport de média système.Starting with Windows 10, version 1607, UWP apps that use the MediaPlayer class to play media are automatically integrated with the SMTC by default. Instanciez simplement une nouvelle instance deMediaPlayer et affectez un objet MediaSource, MediaPlaybackItem ou MediaPlaybackList sur la propriété Source du lecteur. Dès lors, l’utilisateur verra le nom de votre application dans les contrôles de transport de média système et sera en mesure de lire et de suspendre le contenu lu, et de se déplacer dans la liste de lecture à l’aide des contrôles de transport de média système.Simply instantiate a new instance of MediaPlayer and assign a MediaSource, MediaPlaybackItem, or MediaPlaybackList to the player's Source property and the user will see your app name in the SMTC and can play, pause, and move through your playback lists by using the SMTC controls.

Votre application peut créer et utiliser plusieurs objets MediaPlayer simultanément.Your app can create and use multiple MediaPlayer objects at once. Pour chaque instance MediaPlayer active dans votre application, un onglet séparé est créé dans les contrôles de transport de média système. Ici, l’utilisateur peut basculer entre vos différents lecteurs multimédias actifs et ceux d’autres applications en cours d’exécution.For each active MediaPlayer instance in your app, a separate tab is created in the SMTC, allowing the user to switch between your active media players and those of other running apps. Les contrôles de transport de média système affectent le lecteur multimédia actuellement sélectionné.Whichever media player is currently selected in the SMTC is the one that the controls will affect.

Pour plus d’informations sur l’utilisation de MediaPlayer dans votre application, notamment sur sa liaison à un objet MediaPlayerElement dans votre page XAML, consultez la section Lire du contenu audio et vidéo avec MediaPlayer.For more information on using MediaPlayer in your app, including binding it to a MediaPlayerElement in your XAML page, see Play audio and video with MediaPlayer.

Pour plus d’informations sur l’utilisation de MediaSource, MediaPlaybackItem et MediaPlaybackList, consultez la section Éléments, playlists et pistes multimédias.For more information on working with MediaSource, MediaPlaybackItem, and MediaPlaybackList, see Media items, playlists, and tracks.

Ajouter des métadonnées à afficher par les contrôles de transport de média systèmeAdd metadata to be displayed by the SMTC

Si vous souhaitez ajouter ou modifier des métadonnées affichées pour vos éléments multimédias dans les contrôles de transport de média système, comme une vidéo ou un morceau de musique, vous devez mettre à jour les propriétés d’affichage de l’objet MediaPlaybackItem représentant votre élément multimédia.If you want add or modify the metadata that is displayed for your media items in the SMTC, such as a video or song title, you need to update the display properties for the MediaPlaybackItem representing your media item. Commencez par obtenir une référence à l’objet MediaItemDisplayProperties en appelant GetDisplayProperties.First, get a reference to the MediaItemDisplayProperties object by calling GetDisplayProperties. Ensuite, définissez le type de média, de musique ou de vidéo pour l’élément avec la propriété type .Next, set the type of media, music or video, for the item with the Type property. Vous pouvez ensuite remplir les champs MusicProperties ou VideoProperties, en fonction du type de média spécifié.Then you can populate the fields of the MusicProperties or VideoProperties, depending on which media type you specified. Enfin, mettez à jour les métadonnées associées à l’élément multimédia en appelant ApplyDisplayProperties.Finally, update the metadata for the media item by calling ApplyDisplayProperties.

MediaItemDisplayProperties props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Video;
props.VideoProperties.Title = "Video title";
props.VideoProperties.Subtitle = "Video subtitle";
props.VideoProperties.Genres.Add("Documentary");
mediaPlaybackItem.ApplyDisplayProperties(props);
props = mediaPlaybackItem.GetDisplayProperties();
props.Type = Windows.Media.MediaPlaybackType.Music;
props.MusicProperties.Title = "Song title";
props.MusicProperties.Artist = "Song artist";
props.MusicProperties.Genres.Add("Polka");
mediaPlaybackItem.ApplyDisplayProperties(props);

Notes

Les applications doivent définir une valeur pour la propriété type , même si elles ne fournissent pas d’autres métadonnées de média devant être affichées par les contrôles de transport de média système.Apps should set a value for the Type property even if they aren't supplying other media metadata to be displayed by the System Media Transport Controls. Cette valeur aide le système à gérer correctement votre contenu multimédia, y compris empêcher l’activation de l’économiseur d’écran pendant la lecture.This value helps the system handle your media content correctly, including preventing the screen saver from activating during playback.

Utilisez CommandManager pour modifier ou remplacer les commandes par défaut des contrôles de transport de média système.Use CommandManager to modify or override the default SMTC commands

Votre application peut modifier ou remplacer complètement le comportement des contrôles de transport de média système avec la classe MediaPlaybackCommandManager.Your app can modify or completely override the behavior of the SMTC controls with the MediaPlaybackCommandManager class. Une instance du gestionnaire de commandes peut être récupérée pour chaque instance de la classe MediaPlayer, en accédant à la propriété CommandManager.A command manager instance can be obtained for each instance of the MediaPlayer class by accessing the CommandManager property.

Pour chaque commande, comme la commande Next, qui par défaut passe à l’élément suivant d’une classe MediaPlaybackList, le gestionnaire de commandes expose un événement reçu, comme NextReceived, et un objet qui gère le comportement de la commande, comme NextBehavior.For every command, such as the Next command which by default skips to the next item in a MediaPlaybackList, the command manager exposes a received event, like NextReceived, and an object that manages the behavior of the command, like NextBehavior.

L’exemple suivant enregistre un gestionnaire pour l’événement NextReceived et pour l’événement IsEnabledChanged de NextBehavior.The following example registers a handler for the NextReceived event and for the IsEnabledChanged event of the NextBehavior.

_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;

L’exemple suivant illustre un scénario au cours duquel une application tente de désactiver la commande Next après que l’utilisateur a cliqué sur cinq éléments de la playlist, en nécessitant peut-être un certain niveau d’interaction de l’utilisateur avant de poursuivre la lecture du contenu.The following example illustrates a scenario where the app wants to disable the Next command after the user has clicked through five items in the playlist, perhaps requiring some user interaction before continuing playing content. Chaque fois qu’un événement NextReceived est déclenché, un compteur est incrémenté.Each ## the NextReceived event is raised, a counter is incremented. Une fois que le compteur atteint le nombre cible, l’objet EnablingRule de la commande Next est défini sur Never, auquel cas la commande est désactivée.Once the counter reaches the target number, the EnablingRule for the Next command is set to Never, which disables the command.

int _nextPressCount = 0;
private void CommandManager_NextReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerNextReceivedEventArgs args)
{
    _nextPressCount++;
    if (_nextPressCount > 5)
    {
        sender.NextBehavior.EnablingRule = MediaCommandEnablingRule.Never;
        // Perform app tasks while the Next button is disabled
    }
}

Vous pouvez également définir la commande sur Always, ce qui signifieu qu’elle sera toujours activée même si, comme c’est le cas avec l’exemple de la commande Next, la playlist ne comporte plus d’éléments.You can also set the command to Always, which means the command will always be enabled even if, for the Next command example, there are no more items in the playlist. Sinon, vous pouvez définir la commande sur Auto, auquel cas le système détermine si la commande doit être activée en fonction du contenu actuellement lu.Or you can set the command to Auto, where the system determines whether the command should be enabled based on the current content being played.

Pour le scénario décrit ci-dessus, à un moment donné l’application tentera de réactiver la commande Next en définissant EnablingRule sur Auto.For the scenario described above, at some point the app will want to reenable the Next command and does so by setting the EnablingRule to Auto.

_mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Auto;
_nextPressCount = 0;

Étant donné que votre application peut avoir sa propre interface utilisateur pour contrôler la lecture pendant qu’elle se trouve au premier plan, vous pouvez utiliser les événements IsEnabledChanged pour mettre à jour votre propre interface utilisateur afin qu’elle corresponde au SMTC, car les commandes sont activées ou désactivées en accédant au IsEnabled du MediaPlaybackCommandManagerCommandBehavior passé dans le gestionnaire.Because your app may have it's own UI for controlling playback while it is in the foreground, you can use the IsEnabledChanged events to update your own UI to match the SMTC as commands are enabled or disabled by accessing the IsEnabled of the MediaPlaybackCommandManagerCommandBehavior passed into the handler.

private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
    MyNextButton.IsEnabled = sender.IsEnabled;
}

Dans certains cas, vous voudrez remplacer complètement le comportement de la commande des contrôles de transport de média système.In some cases, you may want to completely override the behavior of an SMTC command. L’exemple suivant illustre un scénario dans lequel une application utilise les commandes Next et Previous pour basculer entre les différentes stations de radio sur Internet, au lieu de transiter entre les pistes de la playlist actuelle.The example below illustrates a scenario where an app uses the Next and Previous commands to switch between internet radio stations instead of skipping between tracks in the current playlist. Comme dans l’exemple précédent, un gestionnaire est inscrit pour lors de la réception d’une commande. dans ce cas, il s’agit de l’événement PreviousReceived .As in the previous example, a handler is registered for when a command is received, in this case it is the PreviousReceived event.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

Dans le gestionnaire PreviousReceived , un Report est obtenu en appelant le GetDeferral du MediaPlaybackCommandManagerPreviousReceivedEventArgs passé dans le gestionnaire.In the PreviousReceived handler, first a Deferral is obtained by calling the GetDeferral of the MediaPlaybackCommandManagerPreviousReceivedEventArgs passed into the handler. Cela signale au système d’attendre la fin du report pour exécuter la commande.This tells the system to wait for until the deferall is complete before executing the command. Cette procédure est extrêmement importante si vous envisagez de passer des appels asynchrones dans le gestionnaire.This is extremely important if you are going to make asynchronous calls in the handler. À ce stade, l’exemple appelle une méthode personnalisée qui renvoie une classe MediaPlaybackItem représentant la station de radio précédente.At this point, the example calls a custom method that returns a MediaPlaybackItem representing the previous radio station.

Ensuite, la propriété Handled est examinée afin de garantir que l’événement n’a pas été précédemment traité par un autre gestionnaire.Next, the Handled property is checked to make sure that the event wasn't already handled by another handler. Si ce n’est pas le cas, la propriété Handled est définie sur true.If not, the Handled property is set to true. Ainsi, les contrôles de transport de média système et tous les autres gestionnaires inscrits savent que cette commande déjà traitée ne doit pas être exécutée.This lets the SMTC, and any other subscribed handlers, know that they should take no action to execute this command because it has already been handled. Ensuite, le code définit la nouvelle source pour le lecteur multimédia, qu’il démarre.The code then sets the new source for the media player and starts the player.

Enfin, la commande Complete est appelée sur l’objet de report, afin d’indiquer au système que le traitement de la commande est terminé.Finally, Complete is called on the deferral object to let the system know that you are done processing the command.

private async void CommandManager_PreviousReceived(MediaPlaybackCommandManager sender, MediaPlaybackCommandManagerPreviousReceivedEventArgs args)
{
    var deferral = args.GetDeferral();
    MediaPlaybackItem mediaPlaybackItem = await GetPreviousStation();

    if(args.Handled != true)
    {
        args.Handled = true;
        sender.MediaPlayer.Source = mediaPlaybackItem;
        sender.MediaPlayer.Play();
    }
    deferral.Complete();
}

Contrôle manuel des contrôles de transport de média systèmeManual control of the SMTC

Comme mentionné précédemment dans cet article, les contrôles de transport de média système détectent et affichent automatiquement les informations pour chaque instance de MediaPlayer créée par votre application.As mentioned previously in this article, the SMTC will automatically detect and display information for every instance of MediaPlayer that your app creates. SI vous souhaitez utiliser plusieurs instances de MediaPlayer mais voulez que les contrôles de transport de média système fournissent une seule entrée pour votre application, vous devez définir manuellement le comportement des contrôles de transport de média système, au lieu de vous appuyer sur l’intégration automatique.If you want to use multiple instances of MediaPlayer but want the SMTC to provide a single entry for your app, then you must manually control the behavior of the SMTC instead of relying on automatic integration. En outre, si vous utilisez MediaTimelineController pour contrôler un ou plusieurs lecteurs multimédias, vous devez utiliser l’intégration SMTC manuelle.Also, if you are using MediaTimelineController to control one or more media players, you must use manual SMTC integration. En outre, si votre application utilise une API différente de MediaPlayer, comme la classe AudioGraph pour lire du contenu multimédia, vous devez implémenter l’intégration manuelle des contrôles de transport de média système pour que l’utilisateur les utilise pour contrôler votre application.Also, if your app uses an API other than MediaPlayer, such as the AudioGraph class, to play media, you must implement manual SMTC integration for the user to use the SMTC to control your app. Pour plus d’informations sur le contrôle manuel des contrôles de transport de média système, consultez la section Contrôle manuel des contrôles de transport de média système.For information on how to manually control the SMTC, see Manual control of the System Media Transport Controls.