Kontrol manual Kontrol Transportasi Media Sistem

Dimulai dengan Windows 10, versi 1607, aplikasi UWP yang menggunakan kelas MediaPlayer untuk memutar media secara otomatis terintegrasi dengan System Media Transport Controls (SMTC) secara default. Ini adalah cara yang direkomendasikan untuk berinteraksi dengan SMTC untuk sebagian besar skenario. Untuk informasi selengkapnya tentang menyesuaikan integrasi default SMTC dengan MediaPlayer, lihat Mengintegrasikan dengan Kontrol Transportasi Media Sistem.

Ada beberapa skenario di mana Anda mungkin perlu menerapkan kontrol manual SMTC. Ini termasuk jika Anda menggunakan MediaTimelineController untuk mengontrol pemutaran satu atau beberapa pemutar media. Atau jika Anda menggunakan beberapa pemutar media dan hanya ingin memiliki satu instans SMTC untuk aplikasi Anda. Anda harus mengontrol SMTC secara manual jika Anda menggunakan MediaElement untuk memutar media.

Menyiapkan kontrol transportasi

Jika Anda menggunakan MediaPlayer untuk memutar media, Anda bisa mendapatkan instans kelas SystemMediaTransportControls dengan mengakses properti MediaPlayer.SystemMediaTransportControls . Jika Anda akan mengontrol SMTC secara manual, Anda harus menonaktifkan integrasi otomatis yang disediakan oleh MediaPlayer dengan mengatur properti CommandManager.IsEnabled ke false.

Catatan

Jika Anda menonaktifkan MediaPlaybackCommandManager dari MediaPlayer dengan mengatur IsEnabled ke false, itu akan memutuskan tautan antara MediaPlayerTransportControls yang disediakan oleh MediaPlayerElement, sehingga kontrol transportasi bawaan tidak akan lagi secara otomatis mengontrol pemutaran pemutar. Sebagai gantinya, Anda harus menerapkan kontrol Anda sendiri untuk mengontrol MediaPlayer.

_mediaPlayer = new MediaPlayer();
_systemMediaTransportControls = _mediaPlayer.SystemMediaTransportControls;
_mediaPlayer.CommandManager.IsEnabled = false;

Anda juga bisa mendapatkan instans SystemMediaTransportControls dengan memanggil GetForCurrentView. Anda harus mendapatkan objek dengan metode ini jika Anda menggunakan MediaElement untuk memutar media.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Aktifkan tombol yang akan digunakan aplikasi Anda dengan mengatur properti "diaktifkan" yang sesuai dari objek SystemMediaTransportControls , seperti IsPlayEnabled, IsPauseEnabled, IsNextEnabled, dan IsPreviousEnabled. Lihat dokumentasi referensi SystemMediaTransportControls untuk daftar lengkap kontrol yang tersedia.

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

Daftarkan handler untuk peristiwa ButtonPressed untuk menerima pemberitahuan ketika pengguna menekan tombol.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Menangani penekanan tombol kontrol transportasi media sistem

Peristiwa ButtonPressed dinaikkan oleh kontrol transportasi sistem ketika salah satu tombol yang diaktifkan ditekan. Properti Tombol dari SystemMediaTransportControlsButtonPressedEventArgs yang diteruskan ke penanganan aktivitas adalah anggota enumerasi SystemMediaTransportControlsButton yang menunjukkan tombol mana yang diaktifkan ditekan.

Untuk memperbarui objek pada utas UI dari penanganan aktivitas ButtonPressed , seperti objek MediaElement , Anda harus melakukan marshal panggilan melalui CoreDispatcher. Ini karena penanganan aktivitas ButtonPressed tidak dipanggil dari utas UI dan oleh karena itu pengecualian akan dilemparkan jika Anda mencoba memodifikasi UI secara langsung.

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

Memperbarui kontrol transportasi media sistem dengan status media saat ini

Anda harus memberi tahu SystemMediaTransportControls ketika status media telah berubah sehingga sistem dapat memperbarui kontrol untuk mencerminkan status saat ini. Untuk melakukan ini, atur properti PlaybackStatus ke nilai MediaPlaybackStatus yang sesuai dari dalam peristiwa CurrentStateChangedmediaElement, yang dimunculkan saat status media berubah.

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

Memperbarui kontrol transportasi media sistem dengan info media dan gambar mini

Gunakan kelas SystemMediaTransportControlsDisplayUpdater untuk memperbarui info media yang ditampilkan oleh kontrol transportasi, seperti judul lagu atau seni album untuk item media yang saat ini diputar. Dapatkan instans kelas ini dengan properti SystemMediaTransportControls.DisplayUpdater . Untuk skenario umum, cara yang disarankan untuk meneruskan metadata adalah dengan memanggil CopyFromFileAsync, meneruskan file media yang sedang diputar. Pembaruan tampilan akan secara otomatis mengekstrak metadata dan gambar mini dari file.

Panggil Pembaruan untuk menyebabkan kontrol transportasi media sistem memperbarui UI-nya dengan metadata dan gambar mini baru.

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

Jika skenario Anda memerlukannya, Anda dapat memperbarui metadata yang ditampilkan oleh kontrol transportasi media sistem secara manual dengan mengatur nilai objek MusicProperties, ImageProperties, atau VideoProperties yang diekspos oleh kelas 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();

Catatan

Aplikasi harus menetapkan nilai untuk properti SystemMediaTransportControlsDisplayUpdater.Type meskipun tidak menyediakan metadata media lain untuk ditampilkan oleh Kontrol Transportasi Media Sistem. Nilai ini membantu sistem menangani konten media Anda dengan benar, termasuk mencegah pengaman layar diaktifkan selama pemutaran.

Memperbarui properti garis waktu kontrol transportasi media sistem

Kontrol transportasi sistem menampilkan informasi tentang garis waktu item media yang sedang diputar, termasuk posisi pemutaran saat ini, waktu mulai, dan waktu akhir item media. Untuk memperbarui properti garis waktu kontrol transportasi sistem, buat objek SystemMediaTransportControlsTimelineProperties baru. Atur properti objek untuk mencerminkan status item media yang sedang diputar. Panggil SystemMediaTransportControls.UpdateTimelineProperties untuk menyebabkan kontrol memperbarui garis waktu.

// 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);
  • Anda harus memberikan nilai untuk StartTime, EndTime , dan Posisi agar kontrol sistem menampilkan garis waktu untuk item yang Anda mainkan.

  • MinSeekTime dan MaxSeekTime memungkinkan Anda menentukan rentang dalam garis waktu yang dapat dicari pengguna. Skenario umum untuk ini adalah memungkinkan penyedia konten menyertakan jeda iklan di media mereka.

    Anda harus mengatur MinSeekTime dan MaxSeekTime agar PositionChangeRequest dinaikkan.

  • Disarankan agar Anda menjaga kontrol sistem tetap sinkron dengan pemutaran media Anda dengan memperbarui properti ini kira-kira setiap 5 detik selama pemutaran dan sekali lagi setiap kali status pemutaran berubah, seperti menjeda atau mencari posisi baru.

Menanggapi perubahan properti pemutar

Ada sekumpulan properti kontrol transportasi sistem yang terkait dengan status pemutar media saat ini, bukan status item media yang diputar. Masing-masing properti ini dicocokkan dengan peristiwa yang dinaikkan saat pengguna menyesuaikan kontrol terkait. Properti dan peristiwa ini meliputi:

Properti Kejadian
AutoRepeatMode AutoRepeatModeChangeRequested
PlaybackRate PlaybackRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

  Untuk menangani interaksi pengguna dengan salah satu kontrol ini, pertama-tama daftarkan handler untuk peristiwa terkait.

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Di handler untuk peristiwa, pertama-tama pastikan bahwa nilai yang diminta berada dalam rentang yang valid dan diharapkan. Jika ya, atur properti yang sesuai pada MediaElement lalu atur properti yang sesuai pada objek 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;
    }
}
  • Agar salah satu peristiwa properti pemutar ini dinaikkan, Anda harus menetapkan nilai awal untuk properti . Misalnya, PlaybackRateChangeRequested tidak akan dinaikkan hingga setelah Anda menetapkan nilai untuk properti PlaybackRate setidaknya satu kali.

Gunakan kontrol transportasi media sistem untuk audio latar belakang

Jika Anda tidak menggunakan integrasi SMTC otomatis yang disediakan oleh MediaPlayer, Anda harus berintegrasi secara manual dengan SMTC untuk mengaktifkan audio latar belakang. Minimal, aplikasi Anda harus mengaktifkan tombol putar dan jeda dengan mengatur IsPlayEnabled dan IsPauseEnabled ke true. Aplikasi Anda juga harus menangani peristiwa ButtonPressed . Jika aplikasi Anda tidak memenuhi persyaratan ini, pemutaran audio akan berhenti saat aplikasi Anda berpindah ke latar belakang.

Aplikasi yang menggunakan model satu proses baru untuk audio latar belakang harus mendapatkan instans SystemMediaTransportControls dengan memanggil GetForCurrentView. Aplikasi yang menggunakan model dua proses warisan untuk audio latar belakang harus menggunakan BackgroundMediaPlayer.Current.SystemMediaTransportControls untuk mendapatkan akses ke SMTC dari proses latar belakang mereka.

Untuk informasi selengkapnya tentang memutar audio di latar belakang, lihat Memutar media di latar belakang.