Поделиться через


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

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

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

Элементы управления Transtport system Media

Полный пример интеграции с SMTC см . в примере элементов управления System Media Tranport на github.

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

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

Приложение может одновременно создавать и использовать несколько объектов MediaPlayer . Для каждого активного экземпляра MediaPlayer в приложении создается отдельная вкладка в SMTC, что позволяет пользователю переключаться между активными проигрывателями мультимедиа и другими запущенными приложениями. Любой проигрыватель мультимедиа в настоящее время выбран в 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 , даже если они не предоставляют другие метаданные мультимедиа для отображения системными элементами управления транспортировкой мультимедиа. Это значение помогает системе правильно обрабатывать содержимое мультимедиа, включая предотвращение активации средства сохранения экрана во время воспроизведения.

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

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

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

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

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

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

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, что означает, что команда всегда будет включена, даже если для примера следующей команды нет дополнительных элементов в списке воспроизведения. Или можно задать для команды значение Auto, где система определяет, должна ли команда быть включена на основе текущего содержимого, воспроизводимого.

Для описанного выше сценария в какой-то момент приложение хочет повторно создать следующую команду и сделать это, задав для параметра "ВключитьRule" значение Auto.

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

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

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

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

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

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

Затем проверяется свойство Handled, чтобы убедиться, что событие еще не обработано другим обработчиком. В противном случае для свойства Handled задано значение true. Это позволяет 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, см. в разделе "Управление транспортировкой системных носителей".