Integrar aos Controles de transporte de mídia do sistema
Este artigo mostra como interagir com os controles de transporte de mídia do sistema (SMTC). O SMTC é um conjunto de controles comuns a todos os dispositivos Windows 10 e que fornecem uma maneira consistente para os usuários controlarem a reprodução de mídia para todos os aplicativos em execução que usam o MediaPlayer para reprodução.
Os controles de transporte de mídia do sistema permitem que os desenvolvedores de aplicativos de mídia se integrem à interface do usuário interna do sistema para exibir metadados de mídia, como artista, título do álbum ou título do capítulo. O controle de transporte do sistema também permite que um usuário controle a reprodução de um aplicativo de mídia usando a interface do usuário interna do sistema, como pausar a reprodução e pular para frente e para trás em uma lista de reprodução.
Para obter um exemplo completo que demonstra a integração com o SMTC, consulte Exemplo de controles de transporte de mídia do sistema no github.
Integração automática com SMTC
A partir do Windows 10, versão 1607, os aplicativos UWP que usam a classe MediaPlayer para reproduzir mídia são integrados automaticamente ao SMTC por padrão. Basta instanciar uma nova instância do MediaPlayer e atribuir um MediaSource, MediaPlaybackItem ou MediaPlaybackList à propriedade Source do player e o usuário verá o nome do aplicativo no SMTC e poderá reproduzir, pausar e percorrer suas listas de reprodução usando os controles SMTC.
Seu aplicativo pode criar e usar vários objetos MediaPlayer de uma só vez. Para cada instância ativa do MediaPlayer em seu aplicativo, uma guia separada é criada no SMTC, permitindo que o usuário alterne entre seus players de mídia ativos e os de outros aplicativos em execução. Qualquer reprodutor de mídia atualmente selecionado no SMTC é aquele que os controles afetarão.
Para obter mais informações sobre como usar o MediaPlayer em seu aplicativo, incluindo associá-lo a um MediaPlayerElement em sua página XAML, consulte Reproduzir áudio e vídeo com MediaPlayer.
Para obter mais informações sobre como trabalhar com MediaSource, MediaPlaybackItem e MediaPlaybackList, consulte Itens de mídia, listas de reprodução e faixas.
Adicionar metadados a serem exibidos pelo SMTC
Se você quiser adicionar ou modificar os metadados exibidos para seus itens de mídia no SMTC, como um título de vídeo ou música, será necessário atualizar as propriedades de exibição do MediaPlaybackItem que representa seu item de mídia. Primeiro, obtenha uma referência ao objeto MediaItemDisplayProperties chamando GetDisplayProperties. Em seguida, defina o tipo de mídia, música ou vídeo, para o item com a propriedade Type. Em seguida, você pode preencher os campos de MusicProperties ou VideoProperties, dependendo do tipo de mídia especificado. Por fim, atualize os metadados do item de mídia chamando 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);
Observação
Os aplicativos devem definir um valor para a propriedade Type , mesmo que não estejam fornecendo outros metadados de mídia a serem exibidos pelos Controles de Transporte de Mídia do Sistema. Esse valor ajuda o sistema a lidar com o conteúdo de mídia corretamente, incluindo impedir que o protetor de tela seja ativado durante a reprodução.
Use o CommandManager para modificar ou substituir os comandos SMTC padrão
Seu aplicativo pode modificar ou substituir completamente o comportamento dos controles SMTC com a classe MediaPlaybackCommandManager. Uma instância do gerenciador de comandos pode ser obtida para cada instância da classe MediaPlayer acessando a propriedade CommandManager .
Para cada comando, como o comando Next que, por padrão, pula para o próximo item em um MediaPlaybackList, o gerenciador de comandos expõe um evento recebido, como NextReceived, e um objeto que gerencia o comportamento do comando, como NextBehavior.
O exemplo a seguir registra um manipulador para o evento NextReceived e para o evento IsEnabledChanged do NextBehavior.
_mediaPlayer.CommandManager.NextReceived += CommandManager_NextReceived;
_mediaPlayer.CommandManager.NextBehavior.IsEnabledChanged += NextBehavior_IsEnabledChanged;
O exemplo a seguir ilustra um cenário em que o aplicativo deseja desabilitar o comando Avançar depois que o usuário clica em cinco itens na lista de reprodução, talvez exigindo alguma interação do usuário antes de continuar a reproduzir o conteúdo. Cada ## o evento NextReceived é gerado, um contador é incrementado. Depois que o contador atinge o número de destino, o comando EnablingRule para o Next é definido como Never, o que desabilita o 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
}
}
Você também pode definir o comando como Sempre, o que significa que o comando sempre estará habilitado mesmo se, para o exemplo do comando Próximo , não houver mais itens na lista de reprodução. Ou você pode definir o comando como Auto, onde o sistema determina se o comando deve ser habilitado com base no conteúdo atual que está sendo reproduzido.
Para o cenário descrito acima, em algum momento, o aplicativo desejará reabilitar o comando Next e faz isso definindo o EnablingRule como Auto.
_mediaPlayer.CommandManager.NextBehavior.EnablingRule = MediaCommandEnablingRule.Auto;
_nextPressCount = 0;
Como seu aplicativo pode ter sua própria interface do usuário para controlar a reprodução enquanto ele está em primeiro plano, você pode usar os eventos IsEnabledChanged para atualizar sua própria interface do usuário para corresponder ao SMTC à medida que os comandos são habilitados ou desabilitados acessando o IsEnabled do MediaPlaybackCommandManagerCommandBehavior passado para o manipulador.
private void NextBehavior_IsEnabledChanged(MediaPlaybackCommandManagerCommandBehavior sender, object args)
{
MyNextButton.IsEnabled = sender.IsEnabled;
}
Em alguns casos, talvez você queira substituir completamente o comportamento de um comando SMTC. O exemplo abaixo ilustra um cenário em que um aplicativo usa os comandos Próximo e Anterior para alternar entre estações de rádio da Internet em vez de pular entre faixas na lista de reprodução atual. Como no exemplo anterior, um manipulador é registrado para quando um comando é recebido, neste caso, é o evento PreviousReceived.
_mediaPlayer.CommandManager.PreviousReceived += CommandManager_PreviousReceived;
No manipulador PreviousReceived, primeiro um Deferral é obtido chamando o GetDeferral do MediaPlaybackCommandManagerPreviousReceivedEventArgs passado para o manipulador. Isso informa ao sistema para aguardar até que o adiamento seja concluído antes de executar o comando. Isso é extremamente importante se você for fazer chamadas assíncronas no manipulador. Neste ponto, o exemplo chama um método personalizado que retorna um MediaPlaybackItem que representa a estação de rádio anterior.
Em seguida, a propriedade Handled é verificada para garantir que o evento ainda não tenha sido manipulado por outro manipulador. Caso contrário, a propriedade Handled será definida como true. Isso permite que o SMTC e quaisquer outros manipuladores inscritos saibam que não devem tomar nenhuma ação para executar esse comando porque ele já foi manipulado. Em seguida, o código define a nova fonte para o reprodutor de mídia e inicia o reprodutor.
Por fim, Complete é chamado no objeto de adiamento para que o sistema saiba que você terminou de processar o 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();
}
Controle manual do SMTC
Conforme mencionado anteriormente neste artigo, o SMTC detectará e exibirá automaticamente informações para cada instância do MediaPlayer que seu aplicativo criar. Se você quiser usar várias instâncias do MediaPlayer , mas quiser que o SMTC forneça uma única entrada para seu aplicativo, deverá controlar manualmente o comportamento do SMTC em vez de depender da integração automática. Além disso, se você estiver usando MediaTimelineController para controlar um ou mais reprodutores de mídia, deverá usar a integração SMTC manual. Além disso, se o aplicativo usar uma API diferente do MediaPlayer, como a classe AudioGraph , para reproduzir mídia, você deverá implementar a integração SMTC manual para que o usuário use o SMTC para controlar seu aplicativo. Para obter informações sobre como controlar manualmente o SMTC, consulte Controle manual dos controles de transporte de mídia do sistema.
Tópicos relacionados
- Reprodução de mídia
- Reproduzir áudio e vídeo com o MediaPlayer
- Controle manual dos controles de transporte de mídia do sistema
- Exemplo de controles de transporte de mídia do sistema no github