Compartilhar via


Visão geral: áudio em segundo plano (Aplicativos da Loja do Windows Phone)(HTML)

[ Este artigo destina-se aos desenvolvedores do Windows 8.x e do Windows Phone 8.x que escrevem aplicativos do Windows Runtime. Se você estiver desenvolvendo para o Windows 10, consulte documentação mais recente ]

Você pode criar aplicativos do Windows Phone 8.1 que reproduzam áudio em segundo plano. Isso significa que mesmo depois que o usuário saia do aplicativo pressionando o botão Voltar ou o botão Iniciar no respetivo dispositivo, o seu aplicativo irá continuar a reproduzir o áudio. Esse artigo aborda os componentes de aplicativos de áudio em segundo plano e como eles funcionam em conjunto.

Cenários para reprodução de áudio em segundo plano incluem:

  • Playlists de longa duração O usuário exibe brevemente um aplicativo em primeiro plano para selecionar e iniciar uma playlist, esperando que depois disso a playlist continue sendo reproduzida em segundo plano.
  • Uso do alternador de tarefas O usuário exibe brevemente um aplicativo em primeiro plano para iniciar a reprodução de áudio e depois alterna para outro aplicativo aberto usando a alternância de tarefas. O usuário espera que o áudio continue sendo reproduzido em segundo plano.

Dica  Você pode baixar o código do Exemplo de áudio em segundo plano para o Windows Phone 8.1, que implementa o código discutido nesta visão geral.

 

Arquitetura de áudio em segundo plano

Um aplicativo de áudio em segundo plano usa agentes de segundo plano. Contudo, reproduzir áudio em segundo plano no Windows Phone 8.1 é diferente da maneira como o áudio é reproduzido em segundo plano no Windows 8. O modelo também difere dos agentes de áudio em segundo plano utilizados em versões anteriores do Windows Phone.

Importante  

Você pode usar JavaScript para criar aplicativos de áudio em segundo plano. Entretanto, o Windows Phone 8.1 não permite que o JavaScript seja executado em um processo em segundo plano. O que significa que seu aplicativo e interface do usuário em primeiro plano podem ser escritos em JavaScript, mas sua tarefa em segundo plano deve ser escrita em C# ou C++. O Exemplo de áudio em segundo plano para o Windows Phone 8.1 fornece um exemplo de um aplicativo JavaScript que dá suporte a áudio em segundo plano, usando um agente de segundo plano C#.

 

O namespace Windows.Media.Playback introduz APIs de áudio genéricas e podem ser utilizadas para reproduzir música mesmo em primeiro plano, mas, o propósito primário delas é reproduzir áudio em segundo plano. Ao utilizar essa API, existe um único MediaPlayer global através do qual ocorre toda a reprodução. Seu aplicativo de áudio em segundo plano envia comandos para o media player para configurar a faixa atual, iniciar a reprodução, pausar, avançar e voltar, e assim por diante. Você faz isso através de métodos de chamadas na classe MediaPlayer. O objeto de instância do media player, acessado através da propriedade BackgroundMediaPlayer.Current, se comunica com o media player global para manipular a reprodução de áudio.

Não é possível criar novas instâncias de MediaPlayer.

Use a classe SystemMediaTransportControls para gerar eventos que são usados pelo UVC (controle universal de volume). O UVC é a interface do usuário que aparece quando o usuário do aplicativo pressiona o controle de volume no dispositivo. Você usa os SystemMediaTransportControls para manipular o media player. Além de começar a reproduzir o áudio em seu aplicativo, você pode controlar a reprodução de áudio. Por exemplo, use os SystemMediaTransportControls para enviar eventos à IBackgroundTask em seu aplicativo e você pode implementar lógica da playlist. Há mais discussão sobre a IBackgroundTask posteriormente neste tópico.

O diagrama acima é uma vista simples de como o sistema é projetado. Um aplicativo reproduzindo em segundo plano consiste em dois processos. O primeiro processo é o aplicativo principal, que contém a interface do usuário, executando em primeiro plano. O segundo processo é a tarefa de reprodução em segundo plano, que contém o maquinário de reprodução de áudio e alguma lógica de aplicativo, opcional. O processo em primeiro plano é suspenso ou concluído pelo sistema operacional com base em sua necessidade de recursos. Os processos em segundo plano continuam sendo executados.

Enquanto a reprodução de áudio ocorre no processo em segundo plano, o processo em primeiro plano tem acesso a toda a informação via objetos de proxy. O processo em primeiro plano pode gerenciar as propriedades da instância MediaPlayer no processo em segundo plano. O aplicativo em primeiro plano pode receber notificações de eventos específicos para mídia como MediaOpened, MediaEnded e MediaFailed. Quando o processo termina ou o aplicativo é suspenso, a mídia continua a ser reproduzida.

arquitetura de áudio em segundo plano

Controles de transporte de mídia do sistema

SystemMediaTransportControls é um novo conjunto de API introduzido no Windows 8.1. O Windows Phone 8.1 também implementa essa classe, mas, como o Windows Phone tem um controle de volume global, apenas um processo pode interagir com ele ao mesmo tempo. No contexto de APIs MediaPlayer, é extremamente importante definir a instância e todos os manipuladores no processo em segundo plano. Isso garante que a conexão esteja ligada ao processo correto caso um aplicativo em primeiro plano seja concluído.

Enviando mensagens entre tarefas

Há vezes em que você iria gostar de comunicar entre dois processos de um aplicativo de áudio em segundo plano. Por exemplo, você pode querer que a tarefa em segundo plano notifique a tarefa em primeiro plano quando uma nova faixa começar a ser reproduzida e, em seguida, envie o título da nova música à tarefa em primeiro plano para exibição na tela. Um mecanismo de comunicação simples gera eventos em ambos os processos, em primeiro e segundo planos. Os métodos SendMessageToForeground e SendMessageToBackground chamam cada um eventos na tarefa correspondente. Dados podem ser passados como argumentos para o manipulador de eventos na tarefa receptora. Passe os dados utilizando uma nova classe chamada ValueSet. Essa classe é um dicionário que contém uma cadeia como uma chave e outros tipos de valores como valores. Você pode passar tipos de valores simples, como int, string, bool e assim por diante.

Ciclo de vida de tarefas em segundo plano

O tempo de vida de uma tarefa em segundo plano está extremamente vinculado à habilidade do aplicativo em reproduzir músicas. Por exemplo, quando um usuário pausa um áudio em reprodução, o sistema pode encerrar ou cancelar seu aplicativo, dependendo das circunstâncias.

Sua tarefa em segundo plano é iniciada na primeira vez em que seu aplicativo acessa BackgroundMediaPlayer.Current no código do aplicativo em primeiro plano ou quando você registra um manipulador do evento MessageReceivedFromBackground, o que ocorrer primeiro. Para garantir que os canais de comunicação sejam estabelecidos quando o método IBackgroundTask.Run é chamado, você deve registrar o evento MessageReceivedFromBackground antes de acessar a propriedade BackgroundMediaPlayer.Current pela primeira vez. Seu aplicativo deve esperar pela execução da tarefa em segundo plano antes de tentar iniciar qualquer reprodução de áudio. Dessa forma você poderá assinar eventos de mídia.

Para manter a tarefa em segundo plano viva, seu aplicativo deverá obter uma BackgroundTaskDeferral no método Run e chamar BackgroundTaskDeferral.Complete quando a instância da tarefa receber os eventos Canceled ou Completed. Não espere o método Run, pois isso utiliza recursos e poderá causar o encerramento da tarefa em segundo plano do seu aplicativo.

Sua tarefa em segundo plano recebe o evento Completed quando o método Run é concluído e não é solicitado adiamento. Em alguns casos, quando o aplicativo recebe o evento Canceled, isso pode ser seguido também pelo evento Completed.

Uma tarefa em segundo plano pode também ser cancelada nas seguintes situações:

  • Um novo aplicativo com recursos de reprodução de áudio se inicia.
  • Uma tarefa em segundo plano foi iniciada, mas a música ainda não está tocando, então o aplicativo em primeiro plano é suspenso.
  • Algum tempo antes da tarefa em segundo plano ter sido iniciada, a reprodução é pausada e o aplicativo em primeiro plano é suspenso. A reprodução pode ser pausada pelo usuário ou por outras interrupções de mídia, tais como recebimento de chamadas telefônicas ou chamadas VoIP. Se a chamada telefônica ou a chamada VoIP terminar em cinco minutos, seu aplicativo irá receber a notificação Run com o botão SystemMediaTransportControlsButton.Play indicado no SystemMediaTransportControlsButtonPressedEventArgs. Caso contrário, o usuário terá que iniciar a reprodução explicitamente utilizando o UVC. O UVC não perde o seu estado. No entanto, quando o usuário pressiona o botão Reproduzir, a tarefa em segundo plano é iniciada novamente. Você então obtém uma chamada de método Run e uma notificação SystemMediaTransportControlsButton.Play.

Uma tarefa em segundo plano pode também ser encerrada sem aviso nas seguintes situações:

  • Uma chamada VoIP entra e não há memória suficiente.
  • Uma política de recurso é violada.
  • Um cancelamento ou conclusão de tarefa não é concluído corretamente.

Práticas recomendadas para áudio em segundo plano

O pipeline de mídia é assíncrono por natureza, o que significa que os eventos disparados garantem apenas a ocorrência daqueles eventos e não a ordem deles. Por exemplo, quando seu aplicativo busca um arquivo de áudio de uma fonte remota, o aplicativo irá trazer vários eventos com alteração de estado, tais como Starting, Paused, Closed, e assim por diante. Esses manipuladores não são necessariamente chamados a cada vez na mesma ordem. Você deve confiar completamente nos valores CurrentState do seu manipulador CurrentStateChanged.

MediaOpened é um evento muito importante e desempenha vários papéis. Se você definiu AutoPlay para false e você definiu fonte para MediaPlayer, você ainda receberá MediaOpened. Isso indica que o pipeline de mídia é iniciado e sua mídia está pronta para ser reproduzida. Ao definir uma fonte reprodução de mídia inicia automaticamente. Você não precisa chamar Play após definir a fonte. Outra técnica muito boa é reproduzir explicitamente quando a mídia estiver pronta. Isso pode ser feito definindo AutoPlay para false e chamando especificamente Play no seu manipulador MediaOpened.

Você pode definir a fonte de mídia para vários diferentes tipos de conteúdo chamando SetUriSource, SetFileSource, SetMediaSource ou SetStreamSource. MediaPlayer também tem a habilidade de reproduzir conteúdo protegido. Além de definir uma fonte URI, o sistema depende dos objetos do aplicativo ou código do aplicativo em execução na memória. Também, o processo em segundo plano não tem relação com a memória de processo na tarefa em primeiro plano. Então, certifique-se de definir todos os objetos para definir a fonte deles apenas no processo em segundo plano. O sistema irá acionar uma InvalidCastException se o seu aplicativo tentar definir uma fonte que não seja uma URI no processo em primeiro plano.

BackgroundMediaPlayer.Shutdown fecha o pipeline de mídia e libera o objeto MediaPlayer da memória. Se você tentar acessar uma referência para BackgroundMediaPlayer.Current novamente após chamar Shutdown, você vai obter um erro. Shutdown é para o aplicativo limpar o pipeline de mídia quando a respetiva tarefa é cancelada.

Quando o seu aplicativo fica suspenso, lembre-se de cancelar a assinatura dos eventos MediaPlayer ou você poderá experimentar atividades indesejadas que podem levar ao encerramento do processo em primeiro plano. Entretanto, isso não significa que o processo em primeiro plano irá desaparecer do alternador de tarefas e o usuário ainda poderá voltar ao aplicativo. Quando seu aplicativo é retomado, se você ainda estiver mantendo uma referência a um MediaPlayer suspenso, ele irá gerar um erro se a tarefa de áudio em segundo plano foi cancelada e o pipeline de mídia foi encerrado.

Tópicos relacionados

Exemplo de áudio em segundo plano para Windows Phone 8.1

Como depurar uma tarefa em segundo plano