Condividi tramite


Integrare con i controlli di trasporto multimediale di sistema

Questo articolo illustra come interagire con i controlli di trasporto multimediale di sistema (SMTC). SMTC è un set di controlli comuni a tutti i dispositivi Windows 10 e che consentono agli utenti di controllare la riproduzione multimediale per tutte le app in esecuzione che usano MediaPlayer per la riproduzione.

I controlli di trasporto multimediale di sistema consentono agli sviluppatori di applicazioni multimediali di integrarsi con l'interfaccia utente di sistema predefinita per visualizzare metadati multimediali come artista, titolo dell'album o titolo del capitolo. Il controllo del trasporto di sistema consente inoltre a un utente di controllare la riproduzione di un'app multimediale usando l'interfaccia utente di sistema predefinita, ad esempio sospendere la riproduzione e saltare avanti e indietro in una playlist.

System Media Transtport Controls

Per un esempio completo che illustra l'integrazione con SMTC, vedere Esempio di controlli di trasporto multimediale di sistema in GitHub.

Integrazione automatica con SMTC

A partire da Windows 10 versione 1607, le app UWP che usano la classe MediaPlayer per riprodurre contenuti multimediali vengono integrate automaticamente per impostazione predefinita con gli SMTC. È sufficiente creare un'istanza di MediaPlayer e assegnare un'istanza di MediaSource, MediaPlaybackItem, or MediaPlaybackList alla proprietà Source del lettore e l'utente visualizzerà il nome dell'app nei controlli SMTC e potrà riprodurre, sospendere e spostarsi tra gli elenchi di riproduzione usando i controlli SMTC.

L'app può creare e usare più oggetti MediaPlayer contemporaneamente. Per ogni istanza di MediaPlayer attiva nell'app, viene creata una scheda separata nei controlli SMTC, consentendo all'utente di passare tra i lettori multimediali attivi e quelli di altre app in esecuzione. Qualsiasi lettore multimediale attualmente selezionato nei controlli SMTC è quello su cui i controlli avranno effetto.

Per altre informazioni sull'uso di MediaPlayer nell'app, incluso il binding a MediaPlayerElement nella pagina XAML page, vedere Riprodurre audio e video con MediaPlayer.

Per altre informazioni sull'uso di MediaSource, MediaPlaybackItem e MediaPlaybackList, vedere Elementi multimediali, playlist e tracce.

Aggiungere i metadati da visualizzare dai controlli SMTC

Se si vuole aggiungere o modificare i metadati visualizzati per gli elementi multimediali nei controlli SMTC, ad esempio un titolo di un video o di un brano, è necessario aggiornare le proprietà di visualizzazione per MediaPlaybackItem che rappresenta l'elemento multimediale. Innanzitutto, ottenere un riferimento all'oggetto MediaItemDisplayProperties chiamando GetDisplayProperties. Impostare quindi il tipo di file multimediali, musica o video per l'elemento con la proprietà Type. È quindi possibile compilare i campi di MusicProperties o VideoProperties, a seconda del tipo di supporto specificato. Aggiornare infine i metadati per l'elemento multimediale chiamando 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);

Nota

Le app devono impostare un valore per la proprietà Type anche se non forniscono altri metadati multimediali da visualizzare tramite i Controlli di trasporto multimediale di sistema. Questo valore consente al sistema di gestire correttamente il contenuto multimediale, impedendo l'attivazione dello screen saver durante la riproduzione.

Usare CommandManager per modificare o eseguire l'override dei comandi SMTC predefiniti

L'app può modificare o sostituire completamente il comportamento dei controlli SMTC con la classe MediaPlaybackCommandManager. È possibile ottenere un'istanza di Gestione comandi per ogni istanza della classe MediaPlayer accedendo alla proprietà CommandManager.

Per ogni comando, ad esempio il comando Next che per impostazione predefinita passa all'elemento successivo in MediaPlaybackList, il gestore comandi espone un evento ricevuto, come NextReceived e un oggetto che gestisce il comportamento del comando, ad esempio NextBehavior.

Nell'esempio seguente viene registrato un gestore per l'evento NextReceived e per l'evento IsEnabledChanged di NextBehavior.

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

L'esempio seguente illustra uno scenario in cui l'app vuole disattivare il comando Avanti dopo che l'utente ha fatto clic su cinque elementi nella playlist, ad esempio richiedendo un'interazione dell'utente prima di continuare a riprodurre il contenuto. Ogni ## viene generato l'evento NextReceived, viene incrementato un contatore. Quando il contatore raggiunge il numero di destinazione, l'opzione EnablingRule per il comando Avanti è impostata su Mai, che disattiva il comando.

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

È anche possibile impostare il comando su Sempre, il che significa che il comando verrà sempre abilitato anche se, per l'esempio di comando Avanti, non sono presenti altri elementi nella playlist. In alternativa, è possibile impostare il comando su Auto, in cui il sistema determina se il comando deve essere abilitato in base al contenuto corrente riprodotto.

Per lo scenario descritto in precedenza, a un certo punto l'app vuole riabilitare il comando Avanti e lo fa impostando EnablingRule su Auto.

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

Poiché l'app potrebbe avere un'interfaccia utente personalizzata per controllare la riproduzione mentre è in primo piano, puoi usare gli eventi IsEnabledChanged per aggiornare la tua interfaccia utente in modo che corrispondano ai controlli SMTC perché i comandi sono abilitati o disabilitati accedendo a IsEnabled di MediaPlaybackCommandManagerCommandBehavior passato nell'handler.

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

In alcuni casi, può essere necessario eseguire completamente l'override del comportamento di un comando SMTC. L'esempio seguente illustra uno scenario in cui un'app usa i comandi Avanti e Indietro per passare tra le stazioni radio Internet invece di ignorare le tracce nella playlist corrente. Come nell'esempio precedente, un gestore viene registrato per quando viene ricevuto un comando, in questo caso è l'evento PreviousReceived.

_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;

Nel gestore PreviousReceived, viene prima ottenuto un Deferral chiamando GetDeferral di MediaPlaybackCommandManagerPreviousReceivedEventArgs passato nel gestore. Questo indica al sistema di attendere il completamento del rinvio prima di eseguire il comando. Questa operazione è estremamente importante se si intende effettuare chiamate asincrone nel gestore. A questo punto, l'esempio chiama un metodo personalizzato che restituisce un oggetto MediaPlaybackItem che rappresenta la stazione radio precedente.

Successivamente, la proprietà Handled viene controllata per assicurarsi che l'evento non sia già stato gestito da un altro gestore. In caso contrario, la proprietà Handled è impostata su true. In questo modo i controlli SMTC e tutti gli altri gestori sottoscritti sanno che non devono eseguire alcuna azione per eseguire questo comando perché è già stato gestito. Il codice imposta quindi la nuova origine per il lettore multimediale e avvia il lettore.

Infine, Complete viene chiamato sull'oggetto differito per nel gestore informare il sistema che è stata eseguita l'elaborazione del comando.

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

Controllo manuale dei controlli SMTC

Come accennato in precedenza in questo articolo, i controlli SMTC rileveranno e visualizzeranno automaticamente le informazioni per ogni istanza di MediaPlayer creata dall'app. Se si vogliono usare più istanze di MediaPlayer, ma si vuole che i CONTROLLI SMTC forniscano una singola voce per l'app, si deve controllare manualmente il comportamento dei controlli SMTC invece di basarsi sull'integrazione automatica. Inoltre, se si usa MediaTimelineController per controllare uno o più lettori multimediali, è necessario usare l'integrazione SMTC manuale. Inoltre, se l'app usa un'API diversa da MediaPlayer, ad esempio la classe AudioGraph, per riprodurre elementi multimediali, si deve implementare l'integrazione SMTC manuale per consentire all'utente di usare i controlli SMTC per controllare l'app. Per informazioni su come controllare manualmente i controlli SMTC, vedere Controllo manuale dei controlli di trasporto multimediale di sistema.