Controllo manuale dei controlli di trasporto multimediale di sistema

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 i Controlli di trasporto multimediale di sistema (System Media Transport Controls - SMTC). Questo è il modo consigliato per interagire con i Controlli di sistema per il trasporto multimediale (SMTC) per la maggior parte degli scenari. Per altre informazioni sulla personalizzazione dell'integrazione predefinita dei Controlli di sistema per il trasporto multimediale (SMTC) con MediaPlayer, consultare Integrazione con i Controlli di trasporto multimediale di sistema (System Media Transport Controls - SMTC).

Esistono alcuni scenari in cui potrebbe essere necessario implementare i Controlli di sistema per il trasporto multimediale (SMTC). Ciò include l'uso di un MediaTimelineController per controllare la riproduzione di uno o più Media Player. Oppure se vengono usati Media Player multipli e si desidera avere solo un'istanza di Controlli di sistema per il trasporto multimediale (SMTC)per l'app. Se si usa MediaElement per riprodurre elementi multimediali, è necessario controllare manualmente i Controlli di sistema per il trasporto multimediale (SMTC).

Impostare i controlli di trasporto

Se si usa MediaPlayer per riprodurre contenuti multimediali, è possibile ottenere un'istanza della classe SystemMediaTransportControls accedendo alla proprietà MediaPlayer.SystemMediaTransportControls. Se si desidera controllare manualmente i Controlli di sistema per il trasporto multimediale (SMTC), è necessario disabilitare l'integrazione automatica fornita da MediaPlayer impostando la proprietà CommandManager.IsEnabled su falso.

Nota

Se si abilita il MediaPlaybackCommandManager di MediaPlayer impostando IsEnabled su falso, verrà interrotto il collegamento tra MediaPlayer e TransportControls forniti da MediaPlayerElement, in modo che i controlli di trasporto predefiniti non controllino più automaticamente la riproduzione del lettore. Invece, per controllare MediaPlayer, è necessario implementare controlli personalizzati.

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

Inoltre è possibile ottenere un'istanza di SystemMediaTransportControls chiamando GetForCurrentView. Se si usa MediaElement per riprodurre contenuti multimediali, è necessario ottenere l'oggetto con questo metodo.

_systemMediaTransportControls = SystemMediaTransportControls.GetForCurrentView();

Abilitare i pulsanti che l'app userà impostando la proprietà "è abilitato" corrispondente dell'oggetto SystemMediaTransportControls, ad esempio IsPlayEnabled, IsPauseEnabled, IsNextEnabled e IsPreviousEnabled. Per un elenco completo dei controlli disponibili, consultare la documentazione di riferimento di SystemMediaTransportControls.

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

Registrare un gestore per l'evento ButtonPressed per ricevere notifiche quando l'utente preme un pulsante.

_systemMediaTransportControls.ButtonPressed += SystemControls_ButtonPressed;

Gestire la pressione dei pulsanti dei controlli di trasporto multimediale di sistema

L'evento ButtonPressed viene generato dai controlli di trasporto di sistema quando viene premuto uno dei pulsanti abilitati. La proprietà Pulsante del SystemMediaTransportControlsButtonPressedEventArgs con passaggio al gestore eventi è un membro dell'enumerazione SystemMediaTransportControlsButton che indica quale dei pulsanti abilitati è stato premuto.

Per aggiornare gli oggetti nel thread dell'interfaccia utente del gestore eventi ButtonPressed, ad esempio un oggetto MediaElement, è necessario effettuare il marshalling delle chiamate tramite CoreDispatcher. Ciò è dovuto al fatto che il gestore eventi ButtonPressed non viene chiamato dal thread dell'interfaccia utente e pertanto viene generata un'eccezione se si tenta di modificare direttamente l'interfaccia utente.

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

Aggiornare i controlli di trasporto multimediale di sistema con lo stato multimediale corrente

È necessario inviare una notifica a SystemMediaTransportControls quando lo stato multimediale è stato modificato in modo che il sistema possa aggiornare i controlli in modo che riflettano lo stato corrente. A tale scopo, impostare la proprietà PlaybackStatus sul valore appropriato MediaPlaybackStatus dall'interno dell'evento CurrentStateChanged di MediaElement, generato quando lo stato del supporto cambia.

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

Aggiornare i controlli di trasporto multimediale di sistema con informazioni multimediali e anteprime

Utilizzare la classe SystemMediaTransportControlsDisplayUpdater per aggiornare le informazioni multimediali visualizzate dai controlli di trasporto, ad esempio il titolo del brano o l'immagine dell'album per l'elemento multimediale attualmente in riproduzione. Ottenere un'istanza di questa classe con la proprietà SystemMediaTransportControls.DisplayUpdater. Per scenari comuni il modo consigliato per passare i metadati consiste nel chiamare CopyFromFileAsync, passando il file multimediale attualmente in riproduzione. Il visualizzatore di aggiornamento estrarrà automaticamente i metadati e l'immagine di anteprima dal file.

Chiamare l'Aggiornamento per determinare che i controlli di trasporto multimediale di sistema aggiornino l'interfaccia utente con i nuovi metadati e l'anteprima.

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

Se lo scenario lo richiede, è possibile aggiornare manualmente i metadati visualizzati dai controlli di trasporto multimediale di sistema, impostando i valori degli oggetti MusicProperties, ImageProperties o VideoProperties esposti dalla classe 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();

Nota

Le app devono impostare un valore per la proprietà SystemMediaTransportControlsDisplayUpdater.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.

Aggiornare le proprietà della sequenza temporale dei controlli di trasporto multimediale di sistema

I controlli di trasporto di sistema visualizzano informazioni sulla sequenza temporale dell'elemento multimediale attualmente in riproduzione, tra cui la posizione di riproduzione corrente, l'ora di inizio e l'ora di fine dell'elemento multimediale. Per aggiornare le proprietà della sequenza temporale dei controlli di trasporto di sistema, creare un nuovo oggetto SystemMediaTransportControlsTimelineProperties. Impostare le proprietà dell'oggetto in modo da riflettere lo stato corrente dell'elemento multimediale in riproduzione. Chiamare SystemMediaTransportControls.UpdateTimelineProperties per fare in modo che i controlli aggiornino la sequenza temporale.

// 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);
  • È necessario specificare un valore per StartTime, EndTime e Posizione affinché i controlli di sistema visualizzino una sequenza temporale per l'elemento in riproduzione.

  • MinSeekTime e MaxSeekTime consentono di specificare l'intervallo all'interno della sequenza temporale che l'utente può cercare. Uno scenario comune si verifica quando si consente ai provider di contenuti di includere interruzioni pubblicitarie nei propri supporti.

    È necessario impostare MinSeekTime e MaxSeekTime affinché venga generato PositionChangeRequest.

  • È consigliabile mantenere sincronizzati i controlli di sistema con la riproduzione multimediale aggiornando queste proprietà ogni 5 secondi circa durante la riproduzione e nuovamente ogni volta che lo stato della riproduzione cambia, ad esempio la sospensione o la ricerca di una nuova posizione.

Rispondere alle modifiche delle proprietà del lettore

Esiste un set di proprietà dei controlli di trasporto di sistema correlate allo stato corrente del Media Player stesso, anziché allo stato dell'elemento multimediale in riproduzione. Ognuna di queste proprietà viene confrontata con un evento generato quando l'utente regola il controllo associato. Queste proprietà ed eventi includono:

Proprietà Event
AutoRepeatMode AutoRepeatModeChangeRequested
PlaybackRate PlaybackRateChangeRequested
ShuffleEnabled ShuffleEnabledChangeRequested

  Per gestire l'interazione dell'utente con uno di questi controlli, registrare innanzitutto un gestore per l'evento associato.

_systemMediaTransportControls.PlaybackRateChangeRequested += SystemControls_PlaybackRateChangeRequested;

Nel gestore per l'evento, verificare innanzitutto che il valore richiesto sia compreso in un intervallo valido e previsto. In caso affermativo, impostare la proprietà corrispondente su MediaElement e quindi impostare la proprietà corrispondente sull'oggetto 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;
    }
}
  • Affinché venga generato uno di questi eventi di proprietà del lettore, è necessario impostare un valore iniziale per la proprietà. Ad esempio, PlaybackRateChangeRequested non verrà generato fino a quando non è stato impostato un valore per la proprietà PlaybackRate almeno una volta.

Usare i controlli di trasporto multimediale di sistema per l'audio in background

Se non si usa l'integrazione dei Controlli di trasporto multimediale di sistema (System Media Transport Controls - SMTC) automatica fornita da MediaPlayer, è necessaria l'integrazione manuale con i controlli SMTC per abilitare l'audio in background. È necessario almeno che l'app abiliti i pulsanti di riproduzione e sospensione impostando IsPlayEnabled e IsPauseEnabled come veri. Inoltre l'app deve gestire l'evento ButtonPressed. Se l'app non soddisfa questi requisiti, la riproduzione audio verrà interrotta quando l'app passa in background.

Le app che usano il nuovo modello a un processo per l'audio in background devono ottenere un'istanza di SystemMediaTransportControls chiamando GetForCurrentView. Le app che usano il modello legacy a due processi per l'audio in background devono usare BackgroundMediaPlayer.Current.SystemMediaTransportControls per ottenere l'accesso ai Controlli di trasporto multimediale di sistema (System Media Transport Controls - SMTC) dal processo in background.

Per altre informazioni sulla riproduzione di audio in background, consultare Riprodurre contenuti multimediali in background.