Intégration avec les contrôles de transport de média système
Cet article vous montre comment interagir avec les contrôles de transport multimédia système (SMTC). Le SMTC est un ensemble de contrôles communs à tous les appareils Windows 10 et qui fournissent un moyen cohérent pour les utilisateurs de contrôler la lecture multimédia pour toutes les applications en cours d’exécution qui utilisent MediaPlayer pour la lecture.
Les contrôles de transport multimédia système permettent aux développeurs d’applications multimédias d’intégrer l’interface utilisateur système intégrée pour afficher des métadonnées multimédias telles que l’artiste, le titre de l’album ou le titre du chapitre. Le contrôle de transport 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, par exemple la suspension de la lecture et l’ignorer vers l’avant et vers l’arrière dans une playlist.
Pour obtenir un exemple complet qui illustre l’intégration avec le SMTC, consultez l’exemple Contrôles de transport de média système sur github.
Intégration automatique à SMTC
À compter de Windows 10, version 1607, les applications UWP qui utilisent la classe MediaPlayer pour lire les médias sont automatiquement intégrées au SMTC par défaut. Instanciez simplement une nouvelle instance de MediaPlayer et attribuez un MediaSource, MediaPlaybackItem ou MediaPlaybackList à la propriété Source du lecteur et l’utilisateur verra le nom de votre application dans le SMTC et peut lire, suspendre et parcourir vos listes de lecture à l’aide des contrôles SMTC.
Votre application peut créer et utiliser plusieurs objets MediaPlayer à la fois. Pour chaque instance MediaPlayer active de votre application, un onglet distinct est créé dans le SMTC, ce qui permet à l’utilisateur de basculer entre vos lecteurs multimédias actifs et ceux d’autres applications en cours d’exécution. Quel que soit le lecteur multimédia actuellement sélectionné dans le SMTC est celui que les contrôles affecteront.
Pour plus d’informations sur l’utilisation de MediaPlayer dans votre application, notamment sa liaison à un MediaPlayerElement dans votre page XAML, consultez Lire l’audio et la vidéo avec MediaPlayer.
Pour plus d’informations sur l’utilisation de MediaSource, MediaPlaybackItem et MediaPlaybackList, consultez éléments multimédias, playlists et pistes.
Ajouter des métadonnées à afficher par le SMTC
Si vous souhaitez ajouter ou modifier les métadonnées affichées pour vos éléments multimédias dans le SMTC, comme une vidéo ou un titre de chanson, vous devez mettre à jour les propriétés d’affichage de MediaPlaybackItem représentant votre élément multimédia. Tout d’abord, obtenez une référence à l’objet MediaItemDisplayProperties en appelant GetDisplayProperties. Ensuite, définissez le type de média, de musique ou de vidéo pour l’élément avec la propriété Type. Vous pouvez ensuite remplir les champs de MusicProperties ou VideoProperties, selon le type de média que vous avez spécifié. Enfin, mettez à jour les métadonnées de l’élément multimédia en appelant 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);
Remarque
Les applications doivent définir une valeur pour la propriété Type , même si elles ne fournissent pas d’autres métadonnées multimédias à afficher par les contrôles de transport de média système. Cette valeur aide le système à gérer correctement le contenu multimédia, notamment empêcher l’enregistrement d’écran de s’activer pendant la lecture.
Utiliser CommandManager pour modifier ou remplacer les commandes SMTC par défaut
Votre application peut modifier ou remplacer complètement le comportement des contrôles SMTC avec la classe MediaPlaybackCommandManager. Une instance de gestionnaire de commandes peut être obtenue pour chaque instance de la classe MediaPlayer en accédant à la propriété CommandManager.
Pour chaque commande, telle que la commande Next qui passe par défaut à l’élément suivant d’un 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.
L’exemple suivant inscrit un gestionnaire pour l’événement NextReceived et pour l’événement IsEnabledChanged de NextBehavior.
_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;
L’exemple suivant illustre un scénario dans lequel l’application souhaite désactiver la commande Suivante une fois que l’utilisateur a cliqué sur cinq éléments dans la playlist, peut-être nécessitant une interaction utilisateur avant de continuer à lire du contenu. Chaque ## l’événement NextReceived est déclenché, un compteur est incrémenté. Une fois que le compteur atteint le numéro cible, la commande EnablingRule pour la commande Next est définie sur Never, ce qui désactive la commande.
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 signifie que la commande sera toujours activée même si, pour l’exemple de commande Suivant , il n’y a plus d’éléments dans la playlist. Vous pouvez également définir la commande sur Auto, où le système détermine si la commande doit être activée en fonction du contenu actuel lu.
Pour le scénario décrit ci-dessus, à un moment donné, l’application souhaite réenabler la commande Next et le fait en définissant l’option EnablingRule sur 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 est au premier plan, vous pouvez utiliser les événements IsEnabledChanged pour mettre à jour votre propre interface utilisateur afin de faire correspondre le SMTC en tant que commandes sont activées ou désactivées en accédant à l’IsEnabled du MediaPlaybackCommandManagerCommandBehavior passé dans le gestionnaire.
private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
MyNextButton.IsEnabled = sender.IsEnabled;
}
Dans certains cas, vous souhaiterez peut-être remplacer complètement le comportement d’une commande SMTC. L’exemple ci-dessous illustre un scénario dans lequel une application utilise les commandes Suivant et Précédent pour basculer entre les stations de radio Internet au lieu d’ignorer les pistes dans la playlist actuelle. Comme dans l’exemple précédent, un gestionnaire est inscrit lorsqu’une commande est reçue, dans ce cas, il s’agit de l’événement PreviousReceived .
_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;
Dans le gestionnaire PreviousReceived, un report est d’abord obtenu en appelant GetDeferral de MediaPlaybackCommandManagerPreviousReceivedEventArgs passé dans le gestionnaire. Cela indique au système d’attendre que le report soit terminé avant d’exécuter la commande. Cela est extrêmement important si vous allez effectuer des appels asynchrones dans le gestionnaire. À ce stade, l’exemple appelle une méthode personnalisée qui retourne un MediaPlaybackItem représentant la station de radio précédente.
Ensuite, la propriété Handled est vérifiée pour vous assurer que l’événement n’a pas déjà été géré par un autre gestionnaire. Si ce n’est pas le cas, la propriété Handled a la valeur true. Cela permet au SMTC, ainsi qu’à tous les autres gestionnaires abonnés, de savoir qu’ils ne doivent pas prendre d’action pour exécuter cette commande, car elle a déjà été gérée. Le code définit ensuite la nouvelle source du lecteur multimédia et démarre le lecteur.
Enfin, Complete est appelé sur l’objet de report pour informer le système que vous avez terminé de traiter la commande.
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 du SMTC
Comme mentionné précédemment dans cet article, le SMTC détecte et affiche automatiquement les informations de chaque instance de MediaPlayer créée par votre application. Si vous souhaitez utiliser plusieurs instances de MediaPlayer , mais que le SMTC fournisse une entrée unique pour votre application, vous devez contrôler manuellement le comportement du SMTC au lieu d’utiliser l’intégration automatique. En outre, si vous utilisez MediaTimelineController pour contrôler un ou plusieurs lecteurs multimédias, vous devez utiliser l’intégration smTC manuelle. En outre, si votre application utilise une API autre que MediaPlayer, telle que la classe AudioGraph, pour lire des médias, vous devez implémenter l’intégration smTC manuelle pour que l’utilisateur utilise le SMTC pour contrôler votre application. Pour plus d’informations sur la façon de contrôler manuellement le SMTC, consultez Contrôle manuel des contrôles de transport multimédia système.
Rubriques connexes
- Lecture de contenu multimédia
- Lire du contenu audio et vidéo avec MediaPlayer
- Contrôle manuel des contrôles de transport du support système
- Exemple de contrôles de transport de média système sur github