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

Um app pode gravar o vídeo ou áudio que está sendo reproduzido de outro app e precisa processar o token MediaProjection corretamente. Veja nesta página como fazer isso. Ele também mostra como um administrador de dispositivo pode desativar a capacidade de gravar capturas de tela de qualquer tela e como um app de áudio pode impedir que outros apps gravem o conteúdo reproduzido.

Como processar um token MediaProjection

A API MediaProjection permite que os apps adquirem um token MediaProjection que dá a eles acesso único para capturar o conteúdo da tela ou o áudio. O SO Android solicita a permissão do usuário antes de conceder o token ao 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 streams de áudio associados à sessão deixam de receber fluxos de mídia. Seu app precisa responder adequadamente. Caso contrário, ele continuará gravando um silêncio de áudio ou um stream de vídeo preto.

Para processar a perda de um token, registre um callback na instância MediaProjection usando o método registerCallback e interrompa a gravação quando o método onStop for chamado.

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

Capturar vídeo

Consulte o app de exemplo ScreenCapture para aprender a usar a API Media Projection para capturar a tela de um dispositivo em tempo real e mostrá-la em um SurfaceView.

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

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

Capturar reprodução de áudio

A API AudioPlaybackCapture foi introduzida no Android 10. Essa API permite que os apps copiem o áudio que está sendo reproduzido por outros apps. Esse recurso é análogo da captura de tela, mas para áudio. O principal caso de uso é para apps de streaming que querem capturar o áudio tocado por jogos.

A API AudioPlaybackCapture não afeta a latência do app cujo áudio 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 um objeto AudioRecord e adicionar uma 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

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

Como restringir a captura por conteúdo de áudio

Um app pode limitar qual áudio pode ser capturado usando estes métodos:

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

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 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, o 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 produzido pelo player 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 oferecem suporte a recursos como acessibilidade e legendagem. Por esse motivo, é recomendável que os apps permitam que o sistema capture a reprodução. Nos casos raros 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 política de captura enquanto um app está em execução. Se um MediaPlayer ou AudioTrack estiver sendo reproduzido quando você chamar o método, o áudio não será afetado. É necessário fechar e reabrir o player ou a faixa para que a mudança na política entre em vigor.

Política = manifesto + AudioManager + AudioAttributes

Como a política de captura pode ser especificada em vários locais, é importante entender como a política efetiva é determinada. A política de captura mais restritiva é sempre aplicada. Por exemplo, um app que tenha um manifesto que inclua setAllowedCapturePolicy="false" nunca permitirá que apps que não sejam do sistema capturem o áudio, mesmo que AudioManager#setAllowedCapturePolicy esteja definido como ALLOW_CAPTURE_BY_ALL. Da mesma forma, se AudioManager#setAllowedCapturePolicy estiver definido como ALLOW_CAPTURE_BY_ALL e o manifesto definir setAllowedCapturePolicy="true", mas o AudioAttributes do player de mídia for criado com AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), 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 de manifesto e da 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