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. Nesta página, explicamos 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 áudios ou conteúdos da tela. O SO Android pede ao usuário antes de conceder o token ao aplicativo.

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 streams de áudio associados à sessão param de receber. streams 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 evitar a gravação da 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. Esta API permite que os aplicativos copiem o áudio que está sendo tocado por outros aplicativos. Isso é análogo à captura de tela, mas para áudio. O caso de uso principal é para apps de streaming que querem capturar o áudio de 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. Chamar AudioPlaybackCaptureConfiguration.Builder.build() para criar AudioPlaybackCaptureConfiguration
  2. Transmita a configuração para AudioRecord chamando setAudioPlaybackCaptureConfig.

Como controlar a captura de áudio

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

Como restringir a captura por conteúdo de áudio

Um app pode limitar o áudio que pode ser capturado 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 produz o áudio precisa definir o uso para 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. Android componentes do sistema podem capturar a reprodução por padrão. Muitos desses componentes são personalizados por fornecedores do Android e oferecem suporte a recursos como acessibilidade e legendagem. Por isso, é recomendável que os apps permitem que o sistema capture a reprodução. No caso raro em que você não quiser 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

Você pode chamar AudioManager.setAllowedCapturePolicy() para mudar a captura política enquanto um app está em execução. Se estiver tocando um MediaPlayer ou AudioTrack ao chamar o método, o áudio não é 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 aplicativo cujo manifesto incluir setAllowedCapturePolicy="false" nunca permitirá que elementos capturem o áudio, mesmo que AudioManager#setAllowedCapturePolicy esteja definido para 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 manifest e os política em vigor:

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