Ручное управление элементами управления транспортировкой системных носителей

Приложения WinUI, использующие класс MediaPlayer для воспроизведения мультимедиа, автоматически интегрируются с системными элементами управления транспортировкой мультимедиа (SMTC) по умолчанию. Это рекомендуемый способ взаимодействия с SMTC для большинства сценариев. Дополнительные сведения о настройке интеграции SMTC по умолчанию с MediaPlayer см. в разделе "Интеграция с системными элементами управления транспортировкой мультимедиа".

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

Настройка элементов управления транспортировкой

При использовании MediaPlayer для воспроизведения мультимедиа, вы можете получить экземпляр класса SystemMediaTransportControls, обратившись к свойству MediaPlayer.SystemMediaTransportControls. Если вы собираетесь вручную управлять SMTC, необходимо отключить автоматическую интеграцию, предоставляемую MediaPlayer , установив для свойства CommandManager.IsEnabled значение false.

Замечание

Если отключить MediaPlaybackCommandManager в MediaPlayer, установив IsEnabled в значение false, это разорвет связь между MediaPlayer и TransportControls, предоставляемыми MediaPlayerElement, поэтому встроенные элементы управления транспортом больше не будут автоматически контролировать воспроизведение проигрывателя. Вместо этого необходимо реализовать собственные элементы управления для управления MediaPlayer.

mediaPlayer = new MediaPlayer();
systemMediaTransportControls = mediaPlayer.SystemMediaTransportControls;
mediaPlayer.CommandManager.IsEnabled = false;

l

Включите кнопки, которые будет использовать ваше приложение, задав соответствующее свойство "включено" объекта SystemMediaTransportControls , например IsPlayEnabled, IsPauseEnabled, IsNextEnabled и IsPreviousEnabled. См. справочную документацию SystemMediaTransportControls для полного списка доступных элементов управления.

systemMediaTransportControls.IsPlayEnabled = true;
systemMediaTransportControls.IsPauseEnabled = true;

Зарегистрируйте обработчик события ButtonPressed , чтобы получать уведомления, когда пользователь нажимает кнопку.

systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Обработка нажатий кнопок системных мультимедийных элементов управления

Событие ButtonPressed вызывается системными элементами управления транспортировкой при нажатии одной из включенных кнопок. Свойство Button объекта SystemMediaTransportControlsButtonPressedEventArgs , переданное в обработчик событий, является членом перечисления SystemMediaTransportControlsButton , указывающее, какие из включенных кнопок были нажаты.

Чтобы обновить объекты в потоке пользовательского интерфейса из обработчика событий ButtonPressed , например объекта MediaPlayerElement , необходимо маршализировать вызовы через DispatcherQueue. Это связано с тем, что обработчик событий ButtonPressed не вызывается из потока пользовательского интерфейса, поэтому исключение будет возникать при попытке напрямую изменить пользовательский интерфейс.

async void SystemControls_ButtonPressed(SystemMediaTransportControls sender,
    SystemMediaTransportControlsButtonPressedEventArgs args)
{
    switch (args.Button)
    {
        case SystemMediaTransportControlsButton.Play:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaPlayer.Play();
            });
            break;
        case SystemMediaTransportControlsButton.Pause:
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                mediaPlayer.Pause();
            });
            break;
        default:
            break;
    }
}

Обновите элементы системного управления воспроизведением мультимедиа в соответствии с текущим состоянием мультимедиа

Вы должны уведомить SystemMediaTransportControls , когда состояние носителя изменилось, чтобы система может обновить элементы управления, чтобы отразить текущее состояние. Для этого задайте свойствуPlayStatus соответствующее значение MediaPlaybackStatus из события CurrentStateChangedMediaPlayer, которое возникает при изменении состояния мультимедиа.

private void MediaPlayer_CurrentStateChanged(MediaPlayer sender, object args)
{
    switch (mediaPlayer.CurrentState)
    {
        case MediaPlayerState.Playing:
            systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaPlayerState.Paused:
            systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaPlayerState.Stopped:
            systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaPlayerState.Closed:
            systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

Обновление системных элементов управления транспортировкой мультимедиа с помощью сведений о носителях и эскизов

Используйте класс SystemMediaTransportControlsDisplayUpdater, чтобы обновить сведения о мультимедиа, отображаемые элементами управления воспроизведением, например название песни или альбомную обложку для текущего воспроизведения элемента мультимедиа. Получите экземпляр этого класса с помощью свойства SystemMediaTransportControls.DisplayUpdater . Для типичных сценариев рекомендуемый способ передачи метаданных — вызвать CopyFromFileAsync, передавая в данный момент воспроизводимый файл мультимедиа. Средство обновления отображения автоматически извлекает метаданные и эскиз из файла.

Вызовите обновление , чтобы системные элементы управления транспортировкой мультимедиа обновляли пользовательский интерфейс с новыми метаданными и эскизами.

private async void MediaPlayer_MediaOpened(MediaPlayer sender, object args)
{
    // Get the updater.
    SystemMediaTransportControlsDisplayUpdater updater = systemMediaTransportControls.DisplayUpdater;

    await updater.CopyFromFileAsync(MediaPlaybackType.Music, currentMediaFile);

    // Update the system media transport controls
    updater.Update();
}

Если для этого требуется сценарий, можно обновить метаданные, отображаемые системными элементами управления транспортировкой мультимедиа вручную, задав значения объектов MusicProperties, ImageProperties или VideoProperties, предоставляемых классом DisplayUpdater.


// Get the updater.
SystemMediaTransportControlsDisplayUpdater updater = systemMediaTransportControls.DisplayUpdater;

// Music metadata.
updater.Type = MediaPlaybackType.Music;
updater.MusicProperties.Artist = "artist";
updater.MusicProperties.AlbumArtist = "album artist";
updater.MusicProperties.Title = "song title";

// Set the album art thumbnail.
// RandomAccessStreamReference is defined in Windows.Storage.Streams
updater.Thumbnail =
   RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Music/music1_AlbumArt.jpg"));

// Update the system media transport controls.
updater.Update();

Замечание

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

Обновление свойств временной шкалы системных элементов управления транспортировкой мультимедиа

Системные элементы управления транспортировкой отображают сведения о временной шкале текущего элемента мультимедиа, включая текущее положение воспроизведения, время начала и время окончания элемента мультимедиа. Чтобы обновить свойства временной шкалы системных элементов управления транспортом, создайте объект SystemMediaTransportControlsTimelineProperties . Задайте свойства объекта, чтобы отразить текущее состояние воспроизведения элемента мультимедиа. Вызов SystemMediaTransportControls.UpdateTimelineProperties , чтобы элементы управления обновляли временную шкалу.

// Create our timeline properties object 
var timelineProperties = new SystemMediaTransportControlsTimelineProperties();

// Fill in the data, using the media elements properties 
timelineProperties.StartTime = TimeSpan.FromSeconds(0);
timelineProperties.MinSeekTime = TimeSpan.FromSeconds(0);
timelineProperties.Position = mediaPlayer.Position;
timelineProperties.MaxSeekTime = mediaPlayer.NaturalDuration;
timelineProperties.EndTime = mediaPlayer.NaturalDuration;

// Update the System Media transport Controls 
systemMediaTransportControls.UpdateTimelineProperties(timelineProperties);
  • Чтобы элементы управления системы отображали временную шкалу для воспроизведения вашего элемента, необходимо указать значение StartTime, EndTime и Position.

  • MinSeekTime и MaxSeekTime позволяют указать диапазон в временной шкале, которую пользователь может искать. Типичный сценарий заключается в том, чтобы поставщики содержимого могли включать разрывы рекламы в их средствах массовой информации.

    Необходимо задать MinSeekTime и MaxSeekTime, чтобы PositionChangeRequest была инициирована.

  • Рекомендуется сохранять системные элементы управления в синхронизации с воспроизведением мультимедиа, обновляя эти свойства примерно каждые 5 секунд во время воспроизведения и снова при изменении состояния воспроизведения, например приостановки или поиска новой позиции.

Реагирование на изменения свойств проигрывателя

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

Недвижимость Event
AutoRepeatMode AutoRepeatModeChangeRequested
Скорость воспроизведения ИзменениеСкоростиВоспроизведенияЗапрошено
ShuffleEnabled ShuffleEnabledChangeRequested

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

systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

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

void SystemControls_PlaybackRateChangeRequested(SystemMediaTransportControls sender, PlaybackRateChangeRequestedEventArgs args)
{
    // Check the requested value to make sure it is within a valid and expected range
    if (args.RequestedPlaybackRate >= 0 && args.RequestedPlaybackRate <= 2)
    {
        // Set the requested value on the MediaElement
        mediaPlayer.PlaybackRate = args.RequestedPlaybackRate;

        // Update the system media controls to reflect the new value
        systemMediaTransportControls.PlaybackRate = mediaPlayer.PlaybackRate;
    }
}
  • Чтобы одно из этих событий свойства проигрывателя было вызвано, необходимо задать начальное значение для этого свойства. Например, PlaybackRateChangeRequested не будет возникать до тех пор, пока вы не задали значение свойства PlaybackRate по крайней мере один раз.

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

Если вы не используете автоматическую интеграцию SMTC, предоставляемую MediaPlayer , необходимо вручную интегрировать с SMTC, чтобы включить фоновый звук. Как минимум, приложение должно включить кнопки воспроизведения и приостановки, установив IsPlayEnabled и IsPauseEnabled в true. Приложение также должно обрабатывать событие ButtonPressed . Если ваше приложение не соответствует этим требованиям, воспроизведение звука остановится при переходе приложения на фон.