Capturar reprodução de vídeo e áudio

Um app pode gravar o vídeo ou o áudio que está sendo reproduzido em outro app. Essas e apps precisam lidar com Token MediaProjection corretamente. Esta página explica como fazer isso. Ele também mostra como um administrador do dispositivo pode desativar a capacidade de gravar capturas de tela e como um aplicativo de áudio pode evitar outros apps gravem o conteúdo que ele toca.

Como processar um token MediaProjection

A API MediaProjection permite que os apps adquiram um token MediaProjection que dá acesso único para capturar conteúdo da tela ou áudio. O SO Android pede permissão ao usuário antes de conceder o token ao seu app.

O SO mostra os tokens MediaProjection ativos na interface das Configurações rápidas e permite que os usuários retirem o acesso a um token a qualquer momento. Quando isso acontece, as telas virtuais ou os fluxos de áudio associados à sessão param de receber fluxos de mídia. Seu app precisa responder corretamente. Caso contrário, vai continuar para gravar um silêncio de áudio ou um stream de vídeo preto.

Para lidar com a perda de um token, registre um callback no MediaProjection instância usando o registerCallback e parar de gravar quando o onStop é chamado.

Para saber mais, consulte Projeção de mídia.

Capturar vídeo

Consulte a App de exemplo ScreenCapture (link em inglês) para aprender a usar a API Media Projection para capturar o em tempo real e exibi-lo em um SurfaceView.

Você pode usar o DevicePolicyManager para impedir a gravação de tela. Para contas corporativas (Android for Work), os o administrador pode desativar a coleta de dados do Assistente para o perfil de trabalho usando o setScreenCaptureDisabled .

O codelab Gerenciar dispositivos Android sem um app mostra como proibir capturas de tela.

Capturar reprodução de áudio

A API AudioPlaybackCapture foi lançada no Android 10. Com essa API, é possível copiar o áudio que está sendo reproduzido por outros apps. Isso é análogo à captura de tela, mas para áudio. O caso de uso principal é para apps de streaming que querem capturar o áudio reproduzido por jogos.

A API AudioPlaybackCapture não afeta a latência do app cujo áudio está que está sendo capturado.

Como criar um aplicativo de captura

Por segurança e privacidade, a captura de reprodução impõe algumas limitações. Para capturar um áudio, o aplicativo precisa atender a estes requisitos:

Para capturar áudio de outro app, seu app precisa criar uma Objeto AudioRecord e adicionar um AudioPlaybackCaptureConfiguration a ele. Siga estas etapas:

  1. Chame AudioPlaybackCaptureConfiguration.Builder.build() para criar um AudioPlaybackCaptureConfiguration.
  2. Transmita a configuração para o AudioRecord chamando setAudioPlaybackCaptureConfig.

Como controlar a captura de áudio

O app pode controlar os tipos de conteúdo que ele pode gravar e quais outros tipos de app podem gravar a própria reprodução.

Como restringir a captura por conteúdo de áudio

Um app pode limitar a captura de áudio usando estes métodos:

Não é possível usar os métodos addMatchingUsage() e excludeUsage(). juntas. É preciso escolher uma dessas opções. Da mesma forma, não é possível usar addMatchingUid() e excludeUid() ao mesmo tempo.

Como restringir a captura por outros apps

Você pode configurar um aplicativo para impedir que outros aplicativos capturem o áudio dele. O áudio de um app só pode ser capturado se o app atender a estes requisitos:

Uso

O player que reproduz o áudio precisa definir o tipo de uso como USAGE_MEDIA, USAGE_GAME ou USAGE_UNKNOWN.

Política de captura

A política de captura do player precisa ser AudioAttributes.ALLOW_CAPTURE_BY_ALL, que permite que outros apps capturem a reprodução. Isso pode ser feito de várias maneiras:

Se esses pré-requisitos forem atendidos, qualquer áudio tocado pelo reprodutor poderá ser capturado.

Como desativar a captura do sistema

As proteções que permitem a captura descrita acima se aplicam somente a aplicativos. Os componentes do sistema Android podem capturar a reprodução por padrão. Muitos desses componentes são personalizados por fornecedores do Android e são compatíveis com recursos como acessibilidade e legendas. Por esse motivo, é recomendável que os apps permitam que o sistema capture a própria reprodução. Nos casos raros em que você não quer que o sistema capture a reprodução do app, defina a política de captura como ALLOW_CAPTURE_BY_NONE.

Como configurar o tempo de execução da política

Chame AudioManager.setAllowedCapturePolicy() para mudar a política de captura enquanto um app está em execução. Se estiver tocando um MediaPlayer ou AudioTrack quando você chamar o método, o áudio não será afetado. Você precisa fechar e reabrir o player ou a faixa para que a alteração da política entre em vigor.

Política = manifesto + AudioManager + AudioAttributes

Como a política de captura pode ser especificada em vários lugares, é importante para entender como a política vigente é determinada. A política de captura mais restritiva é sempre aplicada. Por exemplo, um app cujo manifesto inclui setAllowedCapturePolicy="false" nunca permitirá que apps não pertencentes ao sistema capturem o áudio dele, mesmo que AudioManager#setAllowedCapturePolicy esteja definido como ALLOW_CAPTURE_BY_ALL. Da mesma forma, se o AudioManager#setAllowedCapturePolicy é definido como ALLOW_CAPTURE_BY_ALL, e o define setAllowedCapturePolicy="true", mas o argumento AudioAttributes foram construídos com AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), então esse player de mídia não poderá ser capturado por apps que não sejam do sistema.

A tabela abaixo resume o efeito do atributo do manifesto e a política efetiva:

allowAudioPlaybackCapture ALLOW_CAPTURE_BY_ALL ALLOW_CAPTURE_BY_SYSTEM ALLOW_CAPTURE_BY_NONE
verdadeiro qualquer app somente do sistema sem captura
falso somente do sistema somente do sistema sem captura