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


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

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

Существует несколько сценариев, в которых может потребоваться реализовать ручное управление SMTC. К ним относятся, если вы используете MediaTimelineController для управления воспроизведением одного или нескольких проигрывателей мультимедиа. Или если вы используете несколько проигрывателей мультимедиа и хотите иметь только один экземпляр SMTC для вашего приложения. При использовании MediaElement для воспроизведения мультимедиа необходимо вручную управлять 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;

Вы также можете получить экземпляр SystemMediaTransportControls, вызвав GetForCurrentView. При использовании MediaElement для воспроизведения мультимедиа необходимо получить объект с этим методом.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

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

_systemMediaTransportControls.IsPlayEnabled = true;
_systemMediaTransportControls.IsPauseEnabled = true;

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

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

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

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

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

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

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

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

void MediaElement_CurrentStateChanged(object sender, RoutedEventArgs e)
{
    switch (mediaElement.CurrentState)
    {
        case MediaElementState.Playing:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Playing;
            break;
        case MediaElementState.Paused:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Paused;
            break;
        case MediaElementState.Stopped:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Stopped;
            break;
        case MediaElementState.Closed:
            _systemMediaTransportControls.PlaybackStatus = MediaPlaybackStatus.Closed;
            break;
        default:
            break;
    }
}

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

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

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

async void MediaElement_MediaOpened(object sender, RoutedEventArgs e)
{
    // 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 = mediaElement.Position;
timelineProperties.MaxSeekTime = mediaElement.NaturalDuration.TimeSpan;
timelineProperties.EndTime = mediaElement.NaturalDuration.TimeSpan;

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

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

    Необходимо задать MinSeekTime и MaxSeekTime, чтобы объект PositionChangeRequest был поднят.

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

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

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

Свойство Мероприятие
AutoRepeatMode AutoRepeatModeChangeRequested
Воспроизведение ВоспроизведениеRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

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

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

В обработчике события сначала убедитесь, что запрошенное значение находится в допустимом и ожидаемом диапазоне. Если это так, задайте соответствующее свойство в MediaElement и задайте соответствующее свойство в объекте 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
        mediaElement.PlaybackRate = args.RequestedPlaybackRate;

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

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

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

Приложения, использующие новую модель однопроцессного звука для фонового звука, должны получить экземпляр SystemMediaTransportControls, вызвав GetForCurrentView. Приложения, использующие устаревшую двухпроцессную модель для фонового звука, должны использовать BackgroundMediaPlayer.Current.SystemMediaTransportControls , чтобы получить доступ к SMTC из фонового процесса.

Дополнительные сведения о воспроизведении звука в фоновом режиме см. в разделе "Воспроизведение мультимедиа" в фоновом режиме.