Интеграция с системными элементами управления транспортировкой мультимедиа

В этой статье показано, как взаимодействовать с системными элементами управления транспортировкой мультимедиа (SMTC). SMTC — это набор элементов управления, общих для всех устройств с Windows 10 и предоставляющих пользователям единый способ управления воспроизведением мультимедиа во всех выполняемых приложениях, использующих MediaPlayer для воспроизведения.

Системные элементы управления транспортировкой мультимедиа позволяют разработчикам приложений мультимедиа интегрироваться со встроенным системным пользовательским интерфейсом для отображения метаданных мультимедиа, таких как исполнитель, название альбома или название главы. Элемент управления транспортировкой системы также позволяет пользователю управлять воспроизведением мультимедийного приложения с помощью встроенного системного пользовательского интерфейса, например приостанавливать воспроизведение и пропускать вперед и назад в списке воспроизведения.

Элементы управления транспортом системных носителей

Полный пример интеграции с SMTC см. в примере системных элементов управления транспортировкой мультимедиа на GitHub.

Автоматическая интеграция с SMTC

Начиная с Windows 10 версии 1607 приложения UWP, использующие класс MediaPlayer для воспроизведения мультимедиа, автоматически интегрируются с SMTC по умолчанию. Просто создайте новый экземпляр MediaPlayer и назначьте класс MediaSource, MediaPlaybackItem или MediaPlaybackList свойству Source проигрывателя, после чего пользователь увидит имя вашего приложения в SMTC и сможет начинать и приостанавливать воспроизведение, а также перемещаться по спискам воспроизведения с помощью элементов управления SMTC.

Ваше приложение может создавать и использовать несколько объектов MediaPlayer одновременно. В SMTC создается отдельная вкладка для каждого активного экземпляра MediaPlayer в приложении, поэтому пользователь может переключаться между активными проигрывателями мультимедиа вашего и других выполняемых приложений. Действия элементов управления применяются к проигрывателю мультимедиа, выбранному в SMTC.

Дополнительные сведения об использовании MediaPlayer в приложении, включая его привязку к классу MediaPlayerElement на странице XAML, см. в разделе Воспроизведение аудио и видео с помощью MediaPlayer.

Дополнительные сведения об использовании классов MediaSource, MediaPlaybackItem и MediaPlaybackList см. в разделе Элементы, списки воспроизведения и звуковые дорожки мультимедиа.

Добавление метаданных для отображения в SMTC

Если вам требуется добавить или изменить метаданные, отображаемые для элементов мультимедиа в SMTC, например видео или название песни, обновите свойства отображения класса MediaPlaybackItem, представляющего элемент мультимедиа. В первую очередь, получите ссылку на объект MediaItemDisplayProperties, вызвав метод GetDisplayProperties. Затем установите тип мультимедиа (музыка или видео) для элемента с помощью свойства Type. После этого вы можете заполнить поля свойств MusicProperties или VideoProperties в зависимости от указанного типа мультимедиа. Наконец, обновите метаданные для элемента мультимедиа, вызвав метод 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);

Примечание

Приложения должны задавать значение для свойства Type , даже если они не предоставляют другие метаданные мультимедиа, отображаемые системными элементами управления транспортировкой мультимедиа. Это значение помогает системе правильно обрабатывать мультимедийное содержимое, в том числе предотвращать активацию заставки во время воспроизведения.

Использование CommandManager для изменения или переопределения команд по умолчанию SMTC

Ваше приложение может изменять или полностью переопределять поведение элементов управления SMTC с помощью класса MediaPlaybackCommandManager. Для каждого экземпляра класса MediaPlayer можно получить экземпляр диспетчера команд путем доступа к свойству CommandManager.

Для каждой команды, например команды Next, которая по умолчанию переходит к следующему элементу в MediaPlaybackList, диспетчер команд предоставляет полученное событие, например NextReceived, и объект, управляющий поведением команды, например NextBehavior.

В следующем примере регистрируется обработчик для событий NextReceived и IsEnabledChanged объекта NextBehavior.

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

В следующем примере демонстрируется сценарий, в котором приложению требуется отключить команду Next, после того как пользователь пролистал пять элементов в списке воспроизведения. При этом перед продолжением воспроизведения содержимого может потребоваться вмешательство пользователя. При каждом вызове события NextReceived значение счетчика увеличивается. Как только счетчик достигнет целевого значения, свойству EnablingRule команды Next устанавливается значение Never, отключающее команду.

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

Вы также можете установить команде значение Always, то есть она всегда будет включена, даже если в списке воспроизведения больше нет элементов (в примере с командой Next). Либо вы можете установить команде значение Auto, при котором система определяет необходимость включения команды в зависимости от воспроизводимого содержимого.

В описанном выше сценарии приложению в определенный момент потребуется повторно включить команду Next. Для этого оно установит свойству EnablingRule значение Auto.

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

Так как в вашем приложении может быть собственный пользовательский интерфейс для управления воспроизведением на переднем плане, вы можете использовать события IsEnabledChanged для обновления собственного пользовательского интерфейса в соответствии с SMTC по мере включения и отключения команд путем доступа к свойству IsEnabled класса MediaPlaybackCommandManagerCommandBehavior, переданного в обработчик.

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

В некоторых случаях вам может потребоваться полностью переопределить поведение команды SMTC. В следующем примере демонстрируется сценарий, в котором приложение использует команды Next и Previous для переключения между интернет-радиостанциями вместо перехода между музыкальными композициями в текущем списке воспроизведения. Как и в предыдущем примере, при получении команды регистрируется обработчик. В данном случае это событие PreviousReceived.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

В обработчике PreviousReceived сначала получается deferral путем вызова GetDeferralобъекта MediaPlaybackCommandManagerPreviousReceivedEventArgs , переданного в обработчик. Таким образом системе сообщается о необходимости дождаться завершения отсрочки перед выполнением команды. Это крайне важно, если вы собираетесь совершать асинхронные вызовы в обработчике. На этом этапе в примере выполняется вызов пользовательского метода, возвращающего объект MediaPlaybackItem, который представляет предыдущую радиостанцию.

Затем проверяется свойство Handled, чтобы убедиться, что событие еще не было обработано другим обработчиком. В противном случае свойству Handled устанавливается истинное значение. Так SMTC и любые другие пописанные обработчики узнают, что им не следует предпринимать действия для выполнения этой команды, так как она уже обработана. Затем код устанавливает новый источник для проигрывателя мультимедиа и запускает проигрыватель.

Наконец, для объекта отсрочки вызывается метод Complete, чтобы дать системе понять, что вы завершили обработку команды.

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();
}

Ручное управление SMTC

Как уже упоминалось в этой статье, SMTC автоматически обнаруживает и отображает сведения для каждого экземпляра MediaPlayer, созданного приложением. Если вам требуется использовать несколько экземпляров MediaPlayer, но чтобы SMTC при этом предоставлял одну запись для приложения, необходимо вручную управлять поведением SMTC, не полагаясь на автоматическую интеграцию. Кроме того, если вы используете класс MediaTimelineController для управления одним или несколькими проигрывателями мультимедиа, вам потребуется использовать ручную интеграцию SMTC. Помимо этого, если для воспроизведения мультимедиа в вашем приложении используется API, отличный от MediaPlayer, например класс AudioGraph, вам потребуется реализовать ручную интеграцию SMTC, чтобы пользователь мог управлять вашим приложением с помощью SMTC. Сведения о ручном управлении SMTC см. в разделе Ручное управление системными элементами управления транспортировкой мультимедиа.