Mengintegrasikan dengan Kontrol Transportasi Media Sistem

Artikel ini memperlihatkan kepada Anda cara berinteraksi dengan System Media Transport Controls (SMTC). SMTC adalah serangkaian kontrol yang umum untuk semua perangkat Windows 10 dan yang menyediakan cara yang konsisten bagi pengguna untuk mengontrol pemutaran media untuk semua aplikasi yang berjalan yang menggunakan MediaPlayer untuk pemutaran.

Kontrol Transportasi Media Sistem memungkinkan pengembang aplikasi media berintegrasi dengan UI sistem bawaan untuk menampilkan metadata media seperti artis, judul album, atau judul bab. Kontrol transportasi sistem juga memungkinkan pengguna untuk mengontrol pemutaran aplikasi media menggunakan UI sistem bawaan, seperti menjeda pemutaran dan melewati maju dan mundur dalam daftar putar.

Kontrol Transtport Media Sistem

Untuk sampel lengkap yang menunjukkan integrasi dengan SMTC, lihat Sampel Kontrol Tranport Media Sistem di github.

Integrasi otomatis dengan SMTC

Dimulai dengan Windows 10, versi 1607, aplikasi UWP yang menggunakan kelas MediaPlayer untuk memutar media secara otomatis terintegrasi dengan SMTC secara default. Cukup buat instans baru MediaPlayer dan tetapkan MediaSource, MediaPlaybackItem, atau MediaPlaybackList ke properti Sumber pemutar dan pengguna akan melihat nama aplikasi Anda di SMTC dan dapat memutar, menjeda, dan menelusuri daftar pemutaran Anda dengan menggunakan kontrol SMTC.

Aplikasi Anda dapat membuat dan menggunakan beberapa objek MediaPlayer sekaligus. Untuk setiap instans MediaPlayer aktif di aplikasi Anda, tab terpisah dibuat di SMTC, memungkinkan pengguna untuk beralih antara pemutar media aktif Anda dan aplikasi lain yang sedang berjalan. Pemutar media mana pun yang saat ini dipilih di SMTC adalah yang akan dipengaruhi oleh kontrol.

Untuk informasi selengkapnya tentang menggunakan MediaPlayer di aplikasi Anda, termasuk mengikatnya ke MediaPlayerElement di halaman XAML Anda, lihat Memutar audio dan video dengan MediaPlayer.

Untuk informasi selengkapnya tentang bekerja dengan MediaSource, MediaPlaybackItem, dan MediaPlaybackList, lihat Item media, daftar putar, dan trek.

Menambahkan metadata yang akan ditampilkan oleh SMTC

Jika Anda ingin menambahkan atau mengubah metadata yang ditampilkan untuk item media Anda di SMTC, seperti judul video atau lagu, Anda perlu memperbarui properti tampilan untuk MediaPlaybackItem yang mewakili item media Anda. Pertama, dapatkan referensi ke objek MediaItemDisplayProperties dengan memanggil GetDisplayProperties. Selanjutnya, atur jenis media, musik, atau video, untuk item dengan properti Jenis . Kemudian Anda dapat mengisi bidang MusicProperties atau VideoProperties, tergantung pada jenis media mana yang Anda tentukan. Terakhir, perbarui metadata untuk item media dengan memanggil 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);

Catatan

Aplikasi harus menetapkan nilai untuk properti Jenis 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.

Gunakan CommandManager untuk mengubah atau mengambil alih perintah SMTC default

Aplikasi Anda dapat memodifikasi atau sepenuhnya mengambil alih perilaku kontrol SMTC dengan kelas MediaPlaybackCommandManager . Instans manajer perintah dapat diperoleh untuk setiap instans kelas MediaPlayer dengan mengakses properti CommandManager .

Untuk setiap perintah, seperti perintah Berikutnya yang secara default melompat ke item berikutnya di MediaPlaybackList, manajer perintah mengekspos peristiwa yang diterima, seperti NextReceived, dan objek yang mengelola perilaku perintah, seperti NextBehavior.

Contoh berikut mendaftarkan handler untuk peristiwa NextReceived dan untuk peristiwa IsEnabledChanged dari NextBehavior.

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

Contoh berikut mengilustrasikan skenario di mana aplikasi ingin menonaktifkan perintah Berikutnya setelah pengguna mengklik lima item dalam daftar putar, mungkin memerlukan beberapa interaksi pengguna sebelum melanjutkan memutar konten. Setiap ## peristiwa NextReceived dinaikkan, penghitung dinaikkan. Setelah penghitung mencapai nomor target, perintah EnablingRule untuk Next diatur ke Never, yang menonaktifkan perintah.

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

Anda juga dapat mengatur perintah ke Selalu, yang berarti perintah akan selalu diaktifkan meskipun, untuk contoh perintah Berikutnya , tidak ada lagi item dalam daftar putar. Atau Anda dapat mengatur perintah ke Otomatis, di mana sistem menentukan apakah perintah harus diaktifkan berdasarkan konten saat ini yang sedang diputar.

Untuk skenario yang dijelaskan di atas, pada titik tertentu aplikasi ingin mengaktifkan kembali perintah Berikutnya dan melakukannya dengan mengatur EnablingRule ke Auto.

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

Karena aplikasi Anda mungkin memiliki UI sendiri untuk mengontrol pemutaran saat berada di latar depan, Anda dapat menggunakan peristiwa IsEnabledChanged untuk memperbarui UI Anda sendiri agar sesuai dengan SMTC karena perintah diaktifkan atau dinonaktifkan dengan mengakses IsEnabled dari MediaPlaybackCommandManagerCommandBehavior yang diteruskan ke handler.

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

Dalam beberapa kasus, Anda mungkin ingin sepenuhnya mengambil alih perilaku perintah SMTC. Contoh di bawah ini menggambarkan skenario di mana aplikasi menggunakan perintah Berikutnya dan Sebelumnya untuk beralih antar stasiun radio internet alih-alih melompat antar trek dalam daftar putar saat ini. Seperti dalam contoh sebelumnya, handler didaftarkan ketika perintah diterima, dalam hal ini adalah peristiwa PreviousReceived .

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

Dalam handler PreviousReceived , pertama-tama Deferral diperoleh dengan memanggil GetDeferral dari MediaPlaybackCommandManagerPreviousReceivedEventArgs yang diteruskan ke handler. Ini memberi tahu sistem untuk menunggu sampai deferall selesai sebelum menjalankan perintah. Ini sangat penting jika Anda akan melakukan panggilan asinkron di handler. Pada titik ini, contoh memanggil metode kustom yang mengembalikan MediaPlaybackItem yang mewakili stasiun radio sebelumnya.

Selanjutnya, properti Ditangani diperiksa untuk memastikan bahwa peristiwa belum ditangani oleh handler lain. Jika tidak, properti Ditangani diatur ke true. Ini memungkinkan SMTC, dan handler berlangganan lainnya, tahu bahwa mereka seharusnya tidak mengambil tindakan untuk menjalankan perintah ini karena telah ditangani. Kode kemudian mengatur sumber baru untuk pemutar media dan memulai pemutar.

Terakhir, Selesai dipanggil pada objek penangguhan untuk memberi tahu sistem bahwa Anda selesai memproses perintah.

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

Kontrol manual SMTC

Seperti disebutkan sebelumnya dalam artikel ini, SMTC akan secara otomatis mendeteksi dan menampilkan informasi untuk setiap instans MediaPlayer yang dibuat aplikasi Anda. Jika Anda ingin menggunakan beberapa instans MediaPlayer tetapi ingin SMTC menyediakan satu entri untuk aplikasi Anda, maka Anda harus mengontrol perilaku SMTC secara manual alih-alih mengandalkan integrasi otomatis. Selain itu, jika Anda menggunakan MediaTimelineController untuk mengontrol satu atau beberapa pemutar media, Anda harus menggunakan integrasi SMTC manual. Selain itu, jika aplikasi Anda menggunakan API selain MediaPlayer, seperti kelas AudioGraph , untuk memutar media, Anda harus menerapkan integrasi SMTC manual bagi pengguna untuk menggunakan SMTC untuk mengontrol aplikasi Anda. Untuk informasi tentang cara mengontrol SMTC secara manual, lihat Kontrol Transportasi Media Sistem secara manual.