Freigeben über


Integration in die Steuerelemente für den Systemmedientransport

In diesem Artikel erfahren Sie, wie Sie mit den Steuerelementen für den Systemmedientransport (System Media Transport Controls, SMTC) interagieren. SmTC ist eine Reihe von Steuerelementen, die für alle Windows 10-Geräte gemeinsam sind und benutzern eine konsistente Möglichkeit bieten, die Medienwiedergabe für alle ausgeführten Apps zu steuern, die MediaPlayer für die Wiedergabe verwenden.

Mit den Steuerelementen für den Systemmedientransport können Entwickler medienanwendungsintern in die integrierte Systembenutzeroberfläche integrieren, um Medienmetadaten wie Künstler, Albumtitel oder Kapiteltitel anzuzeigen. Mit dem Systemtransportsteuerelement kann ein Benutzer auch die Wiedergabe einer Medien-App mithilfe der integrierten Systembenutzeroberfläche steuern, z. B. die Wiedergabe anhalten und in einer Wiedergabeliste vorwärts und rückwärts überspringen.

Systemmedientransportierungssteuerelemente

Ein vollständiges Beispiel, das die Integration mit SMTC veranschaulicht, finden Sie unter System Media Transport Controls sample on github.

Automatische Integration in SMTC

Ab Windows 10, Version 1607, sind UWP-Apps, die die MediaPlayer-Klasse zum Wiedergeben von Medien verwenden, standardmäßig automatisch in SMTC integriert. Instanziieren Sie einfach eine neue Instanz von MediaPlayer, und weisen Sie der Source-Eigenschaft des Players ein MediaSource-, MediaPlaybackItem- oder MediaPlaybackList-Element zu, und der Benutzer sieht Ihren App-Namen im SMTC und kann Ihre Wiedergabelisten mithilfe der SMTC-Steuerelemente wiedergeben, anhalten und durchlaufen.

Ihre App kann mehrere MediaPlayer-Objekte gleichzeitig erstellen und verwenden. Für jede aktive MediaPlayer-Instanz in Ihrer App wird im SMTC eine separate Registerkarte erstellt, sodass der Benutzer zwischen Ihren aktiven Media Playern und denen anderer ausgeführter Apps wechseln kann. Unabhängig davon, welcher Media Player derzeit im SMTC ausgewählt ist, ist das Steuerelement, das sich auf die Steuerelemente auswirkt.

Weitere Informationen zur Verwendung von MediaPlayer in Ihrer App, einschließlich der Bindung an ein MediaPlayerElement auf Ihrer XAML-Seite, finden Sie unter Wiedergeben von Audio und Video mit MediaPlayer.

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

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

Wenn Sie die Metadaten hinzufügen oder ändern möchten, die für Ihre Medienelemente in SMTC angezeigt werden, z. B. ein Video- oder Songtitel, müssen Sie die Anzeigeeigenschaften für das MediaPlaybackItem-Objekt aktualisieren, das Ihr Medienelement darstellt. Rufen Sie zunächst einen Verweis auf das MediaItemDisplayProperties-Objekt ab, indem Sie GetDisplayProperties aufrufen. Legen Sie als Nächstes den Typ von Medien, Musik oder Video für das Element mit der Type-Eigenschaft fest. Anschließend können Sie die Felder der MusicProperties oder VideoProperties auffüllen, je nachdem, welchen Medientyp Sie angegeben haben. Aktualisieren Sie schließlich die Metadaten für das Medienelement, 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 Steuerelementen für den Systemmedientransport angezeigt werden sollen. Dieser Wert hilft dem System, Ihre Medieninhalte korrekt zu verarbeiten, einschließlich der Verhinderung der Aktivierung des Bildschirmschoners während der Wiedergabe.

Verwenden von CommandManager zum Ändern oder Überschreiben der standardmäßigen SMTC-Befehle

Ihre App kann das Verhalten der SMTC-Steuerelemente mit der MediaPlaybackCommandManager-Klasse ändern oder vollständig außer Kraft setzen. Eine Befehls-Manager-Instanz kann für jede Instanz der MediaPlayer-Klasse durch Zugriff auf die CommandManager-Eigenschaft abgerufen werden.

Für jeden Befehl, z. B. den Befehl "Weiter", der standardmäßig mit dem nächsten Element in einer MediaPlaybackList überspringt, macht der Befehlsmanager ein empfangenes Ereignis wie NextReceived und ein Objekt verfügbar, das das Verhalten des Befehls verwaltet, z. B. NextBehavior.

Im folgenden Beispiel wird ein Handler für das NextReceived-Ereignis und für das IsEnabledChanged-Ereignis des NextBehavior registriert.

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

Im folgenden Beispiel wird ein Szenario veranschaulicht, in dem die App den Befehl "Weiter " deaktivieren möchte, nachdem der Benutzer auf fünf Elemente in der Wiedergabeliste geklickt hat, z. B. eine Benutzerinteraktion vor dem Fortsetzen der Wiedergabe von Inhalten. Jedes ##-Ereignis, das nextReceived-Ereignis ausgelöst wird, wird ein Zähler erhöht. Sobald der Zähler die Zielnummer erreicht hat, wird die EnablingRule für den Befehl "Weiter" auf "Nie" festgelegt, wodurch der Befehl deaktiviert wird.

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 immer aktiviert wird, auch wenn für das Beispiel für den nächsten Befehl keine weiteren Elemente in der Wiedergabeliste vorhanden sind. Oder Sie können den Befehl auf "Automatisch" festlegen, wobei das System bestimmt, ob der Befehl basierend auf dem aktuellen wiedergegebenen Inhalt aktiviert werden soll.

Für das oben beschriebene Szenario möchte die App irgendwann den Befehl "Weiter" erneut aktivieren und dazu die Option "EnablingRule " auf "Auto" festlegen.

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

Da Ihre App möglicherweise über eine eigene Benutzeroberfläche zum Steuern der Wiedergabe verfügt, während sie sich im Vordergrund befindet, können Sie die IsEnabledChanged-Ereignisse verwenden, um Ihre eigene Benutzeroberfläche so zu aktualisieren, dass sie mit dem SMTC übereinstimmt, da Befehle aktiviert oder deaktiviert werden, indem Sie auf die IsEnabled des mediaPlaybackCommandManagerCommandBehavior zugreifen, der an den Handler übergeben wird.

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

In einigen Fällen sollten Sie das Verhalten eines SMTC-Befehls vollständig außer Kraft setzen. Das folgende Beispiel veranschaulicht ein Szenario, in dem eine App die Befehle "Weiter" und "Vorherige " verwendet, um zwischen Internet-Radiosendern zu wechseln, anstatt zwischen den Titeln in der aktuellen Wiedergabeliste zu überspringen. Wie im vorherigen Beispiel wird ein Handler für den Empfang eines Befehls registriert, in diesem Fall ist er das PreviousReceived-Ereignis.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

Im PreviousReceived-Handler wird zuerst eine Verzögerung abgerufen, indem die GetDeferral des mediaPlaybackCommandManagerPreviousReceivedEventArgs aufgerufen wird, die an den Handler übergeben werden. Dadurch wird dem System mitgeteilt, bis die Verzögerung abgeschlossen ist, bevor der Befehl ausgeführt wird. Dies ist äußerst wichtig, wenn Sie asynchrone Aufrufe im Handler ausführen werden. An diesem Punkt ruft das Beispiel eine benutzerdefinierte Methode auf, die ein MediaPlaybackItem zurückgibt, das die vorherige Radiostation darstellt.

Als Nächstes wird die Handled-Eigenschaft überprüft, um sicherzustellen, dass das Ereignis noch nicht von einem anderen Handler behandelt wurde. Ist dies nicht der Fall, wird die Handled-Eigenschaft auf "true" festgelegt. Dadurch können die SMTC und alle anderen abonnierten Handler wissen, dass sie keine Aktion ausführen sollten, um diesen Befehl auszuführen, da er bereits behandelt wurde. Der Code legt dann die neue Quelle für den Media Player fest und startet den Player.

Schließlich wird Complete für das Verzögerungsobjekt aufgerufen, um dem System mitzuteilen, dass Sie mit der Verarbeitung des Befehls fertig sind.

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 der SMTC

Wie bereits in diesem Artikel erwähnt, erkennt und zeigt SMTC automatisch Informationen für jede Instanz von MediaPlayer an, die Ihre App erstellt. Wenn Sie mehrere Instanzen von MediaPlayer verwenden möchten, die SMTC jedoch einen einzelnen Eintrag für Ihre App bereitstellen soll, müssen Sie das Verhalten der SMTC manuell steuern, anstatt sich auf die automatische Integration zu verlassen. Wenn Sie MediaTimelineController zum Steuern eines oder mehrerer Media Player verwenden, müssen Sie auch die manuelle SMTC-Integration verwenden. Wenn Ihre App auch eine andere API als MediaPlayer verwendet, z. B. die AudioGraph-Klasse, um Medien wiederzugeben, müssen Sie manuelle SMTC-Integration implementieren, damit der Benutzer die SMTC zum Steuern ihrer App verwenden kann. Informationen zum manuellen Steuern der SMTC finden Sie unter Manuelle Steuerung der Steuerelemente für den Systemmedientransport.