Intégration avec les contrôles de transport de média système

Cet article vous explique comment interagir avec les contrôles de transport de média système. 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.

Les contrôles de transport multimédia système permettent aux développeurs d’applications multimédias de s’intégrer à l’interface utilisateur système intégrée pour afficher les 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 le saut vers l’avant et l’arrière dans une playlist.

Contrôles de transtport du média système

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.

Intégration automatique avec les contrôles de transport de média système

À 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. 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.

Votre application peut créer et utiliser plusieurs objets MediaPlayer simultanément. 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. Les contrôles de transport de média système affectent le lecteur multimédia actuellement sélectionné.

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.

Pour plus d’informations sur l’utilisation de MediaSource, MediaPlaybackItem et MediaPlaybackList, consultez la section Éléments, playlists et pistes multimédias.

Ajouter des métadonnées à afficher par les contrôles de transport de média système

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. 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 MusicProperties ou VideoProperties, en fonction du type de média spécifié. Enfin, mettez à jour les métadonnées associées à 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);

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 multimédias à afficher par les contrôles de transport multimédia système. Cette valeur aide le système à gérer correctement votre contenu multimédia, notamment en empêchant l’activation de l’économiseur d’écran pendant la lecture.

Utilisez CommandManager pour modifier ou remplacer les commandes par défaut des contrôles de transport de média système.

Votre application peut modifier ou remplacer complètement le comportement des contrôles de transport de média système avec la classe MediaPlaybackCommandManager. 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.

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.

L’exemple suivant enregistre 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 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. Chaque fois qu’un événement NextReceived est déclenché, un compteur est incrémenté. 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.

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. 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.

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.

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

Étant donné que votre application peut avoir sa propre interface utilisateur pour contrôler la lecture alors qu’elle est au premier plan, vous pouvez utiliser les événements IsEnabledChanged pour mettre à jour votre propre interface utilisateur pour qu’elle corresponde au SMTC à mesure que les 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 voudrez remplacer complètement le comportement de la commande des contrôles de transport de média système. 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. Comme dans l’exemple précédent, un gestionnaire est inscrit pour 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, dans un premier temps un objet Deferral est récupéré en appelant l’instance GetDeferral de MediaPlaybackCommandManagerPreviousReceivedEventArgs transmise au gestionnaire. Cela signale au système d’attendre la fin du report pour exécuter la commande. Cette procédure est extrêmement importante si vous envisagez de passer des appels asynchrones dans le gestionnaire. À ce stade, l’exemple appelle une méthode personnalisée qui renvoie une classe MediaPlaybackItem représentant la station de radio précédente.

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. Si ce n’est pas le cas, la propriété Handled est définie sur 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. Ensuite, le code définit la nouvelle source pour le lecteur multimédia, qu’il démarre.

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é.

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ème

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. 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. 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 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. 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.