Integration in die Steuerelemente für den Systemmedientransport

In diesem Artikel wird erläutert, wie Sie mit den Steuerelementen für den Systemmedientransport (System Media Transport Controls, SMTC) arbeiten. SMTC ist eine Reihe von Steuerelementen, die auf allen Windows 10-Geräten verfügbar ist. Sie bieten den Benutzern eine einheitliche Methode zum Steuern der Wiedergabe von Medien für alle ausgeführten Apps, die Sound über MediaPlayer ausgeben.

Mit den Systemmedientransportsteuerelementen können Entwickler von Medienanwendungen die Integration in die integrierte Systembenutzeroberfläche ermöglichen, um Medienmetadaten wie Künstler, Albumtitel oder Kapiteltitel anzuzeigen. Das Systemtransportsteuerelement ermöglicht es einem Benutzer auch, die Wiedergabe einer Medien-App mithilfe der integrierten Systembenutzeroberfläche zu steuern, z. B. das Anhalten der Wiedergabe und das Überspringen von vorwärts und rückwärts in einer Wiedergabeliste.

Systemmedientransport-Steuerelemente

Ein vollständiges Beispiel, das die Integration in SMTC veranschaulicht, finden Sie in dem Beispiel für die Steuerelemente für den Systemmedientransport auf GitHub.

Automatische Integration in SMTC

Ab Windows 10, Version 1607, sind UWP-Apps, die die MediaPlayer-Klasse für die Medienwiedergabe verwenden, automatisch in SMTC integriert. Erstellen Sie einfach eine neue Instanz von MediaPlayer , und weisen Sie der Source-Eigenschaft ein MediaSource-, MediaPlaybackItem- oder MediaPlaybackList-Objekt zu. Dem Benutzer wird der Name Ihrer App in SMTC angezeigt, und er kann mit den Steuerelementen für den Systemmedientransport durch seine Wiedergabelisten navigieren und Titel wiedergeben und anhalten.

Ihre App kann mehrere MediaPlayer Objekte auf einmal erstellen und verwenden. Für jede aktive MediaPlayer-Instanz in Ihrer App wird in SMTC eine separaten Registerkarte erstellt, sodass der Benutzer zwischen dem aktiven MediaPlayer und den Instanzen in anderen ausgeführten Apps wechseln kann. Die Steuerelemente bedienen den jeweils ausgewählten MediaPlayer.

Weitere Informationen zur Verwendung von MediaPlayer in Ihrer App, u. a. zum Einbinden an ein MediaPlayerElement-Objekt in der XAML-Seite finden Sie unter Audio-und Videowiedergabe mit MediaPlayer.

Weitere Informationen zum Arbeiten mit MediaSource-, MediaPlaybackItem- und MediaPlaybackList-Objekten finden Sie unter Medienelemente, Wiedergabelisten und Titel.

Hinzufügen von Metadaten, die von SMTC angezeigt werden sollen

Wenn Sie Metadaten, die für die Medienobjekte in SMTC angezeigt werden, hinzufügen oder ändern möchten z. B. dass ein Video oder Songtitel angezeigt wird, müssen Sie die Anzeigeeigenschaften für das MediaPlaybackItem, das Ihr Medienelement darstellt, aktualisieren. Rufen Sie zunächst einen Verweis auf das MediaItemDisplayProperties-Objekt ab, indem Sie GetDisplayProperties aufrufen. Legen Sie dann den Medientyp für das Objekt mit der Type-Eigenschaft als Musik oder Video fest. Anschließend können Sie Werte in die Felder für die MusicProperties- bzw. VideoProperties-Eigenschaften einfügen, je nachdem, welchen Medientyp Sie angegeben haben. Zum Schluss aktualisieren Sie die Metadaten für das Medienobjekt, indem Sie ApplyDisplayProperties aufrufen.

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

Hinweis

Apps sollten einen Wert für die Type-Eigenschaft festlegen, auch wenn sie keine anderen Medienmetadaten bereitstellen, die von den SystemMedientransportsteuerelementen angezeigt werden sollen. Dieser Wert hilft dem System, Ihre Medieninhalte ordnungsgemäß zu verarbeiten, einschließlich der Verhinderung der Aktivierung des Bildschirmschoner während der Wiedergabe.

Verwenden Sie CommandManager, um die Standard-SMTC-Befehle zu ändern oder zu überschreiben.

Ihre App kann das Verhalten der SMTC-Steuerelemente in der MediaPlaybackCommandManager-Klasse ändern oder vollständig überschreiben. Sie können für jede Instanz der MediaPlayer-Klasse eine Befehlsmanagerinstanz abrufen, indem Sie auf die CommandManager-Eigenschaft zugreifen.

Für jeden Befehl, beispielsweise den Befehl Next, der standardmäßig zum nächsten Element in einer MediaPlaybackList-Liste springt, veröffentlicht der Befehlsmanager empfangene Ereignisse (z. B. NextReceived) und ein Objekt, das Verhalten des Befehls verwaltet (z. B. NextBehavior).

In dem folgenden Beispiel wird ein Handler für das NextReceived Ereignis und für das IsEnabledChanged-Ereignis von NextBehavior registriert.

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

Das folgende Beispiel illustriert ein Anwendungsszenario, in dem die App den Befehl Next deaktiviert, nachdem der Benutzer nacheinander auf fünf Elemente in der Playlist geklickt hat, weil vielleicht ein Benutzereingriff erforderlich ist, bevor weiter Inhalte wiedergegeben werden. Jedes Mal, wenn das NextReceived-Ereignis ausgelöst wird, wird ein Zähler erhöht. Wenn der Zähler die angegebene Zahl erreicht, wird die EnablingRule-Eigenschaft für den Next-Befehl auf Never festgelegt, was den Befehl deaktiviert.

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

Sie können den Befehl auch auf Always festlegen, was bedeutet, dass der Befehl auch dann aktiviert ist, wenn bei dem Next-Befehl in dem Beispiel keine Elemente mehr in der Playlist vorhanden sind. Alternativ können Sie den Befehl auf Auto festlegen. In diesem Fall bestimmt das System auf der Grundlage des aktuell wiedergegebenen Inhalts, ob der Befehl aktiviert werden soll.

Bei dem oben beschriebenen Anwendungsszenario sollte die App zu einem bestimmten Zeitpunkt den Next-Befehl wieder aktivieren. Dies erfolgt, indem EnablingRule auf Auto festgelegt wird.

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

Da Ihre App möglicherweise eine eigene UI zum Steuern der Videowiedergabe hat, wenn sie sich im Vordergrund befindet, können Sie mithilfe der IsEnabledChanged-Ereignisse die eigene Benutzeroberfläche entsprechend den Steuerelemente für den Systemmedientransport aktualisieren, sobald Befehle aktiviert oder deaktiviert werden, indem Sie auf IsEnabled von MediaPlaybackCommandManagerCommandBehavior zugreifen, das an den Handler übergeben wird.

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

In einigen Fällen gibt es Gründe, das Verhalten eines Befehls in den Steuerelementen für den Systemmedientransport vollständig zu überschreiben. Das folgende Beispiel illustriert ein Anwendungsszenario, in dem eine App die Befehle Next und Previous verwendet, um zwischen Internetradiosendern zu wechseln statt zwischen den Titeln der aktuellen Playlist. Wie im vorherigen Beispiel wird ein Handler registriert, wenn ein Befehl empfangen wird. In diesem Fall ist dies das PreviousReceived-Ereignis.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

Im PreviousReceived-Handler wird zunächst ein Deferral abgerufen, indem die GetDeferral des mediaPlaybackCommandManagerPreviousReceivedEventArgs aufgerufen wird, das an den Handler übergeben wurde. Dies weist das System an, entsprechend der Verzögerung zu warten, und erst dann den Befehl auszuführen. Dies ist sehr wichtig, wenn Sie beabsichtigen, in dem Ereignishandler asynchrone Aufrufe auszuführen. An dieser Stelle wird im Beispiel eine angepasste Methode aufgerufen, die einen MediaPlaybackItem-Wert zurückgibt, der den vorherigen Radiosender darstellt.

Als Nächstes wird die Handled-Eigenschaft überprüft, um sicherzustellen, dass das Ereignis nicht bereits von einem anderen Handler verarbeitet wird. Wenn dies nicht der Fall ist, wird die Eigenschaft Handled auf „true“ festgelegt. Auf diese Weise können die Steuerelemente für den Systemmedientransport und auch alle anderen abonnierten Handler wissen, dass sie keine weiteren Aktionen zum Ausführen dieses Befehls auslösen sollen, da dieser bereits verarbeitet wird. Anschließend wird die neue Quelle für die Medienwiedergabe festgelegt und der Player gestartet.

Schließlich wird für das Deferral-Objekt die Funktion Complete aufgerufen, um dem System mitzuteilen, dass die Verarbeitung des Befehls abgeschlossen wurde.

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

Manuelle Steuerung von SMTC

Wie weiter oben in diesem Artikel bereits erwähnt, erkennt der SMTC automatisch die Informationen für jede einzelne Instanz von MediaPlayer, die Ihre App erstellt, und zeigt diese an. Wenn Sie mehrere Instanzen von MediaPlayer verwenden möchten, SMTC jedoch noch einen einzelnen Eintrag für Ihre App bereitstellt, müssen Sie das Verhalten von SMTC manuell steuern anstatt sich auf die automatische Integration zu verlassen. Auch wenn Sie MediaTimelineController verwenden, um mindestens ein MediaPlayer zu steuern, müssen Sie die SMTC-Integration manuell durchführen. Dies gilt außerdem, wenn Ihre App ein anderes API als MediaPlayer verwendet, um Medien wiederzugeben, z. B. die AudioGraph-Klasse. Auch in diesem Fall müssen Sie die SMTC-Integration manuell durchführen, damit der Benutzer Ihre App mit den Steuerelementen für den Systemmedientransport bedienen kann. Informationen zur manuellen Bedienung der Steuerelemente für den Systemmedientransport finden Sie unter Manuelle Steuerung der Steuerelemente für den Systemmedientransport.