Captura de reprodução

O Android Q tem uma nova API AudioPlaybackCapture, que oferece aos apps a capacidade de copiar o áudio que está sendo reproduzido por outros apps. Esse recurso é a versão em áudio da captura de tela. O principal caso de uso é o de apps de streaming que querem capturar o áudio reproduzido em jogos.

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

Criar um app de captura

Pré-requisitos

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

Captura de áudio

Para capturar o á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 uma AudioPlaybackCaptureConfiguration.
  2. Passe a configuração para o AudioRecord chamando setAudioPlaybackCaptureConfig.

Restringir a captura por conteúdo de áudio

Um app pode limitar o áudio que pode ser capturado usando os seguintes métodos:

Não é possível usar os métodos addMatchingUsage() e excludeUsage() juntos. É preciso escolher um ou outro. Da mesma forma, não é possível usar addMatchingUid() e excludeUid() ao mesmo tempo.

Permitir a captura de reprodução

É possível configurar um app para impedir que outros apps capturem o áudio dele. O áudio de um app só pode ser capturado se o app atender a estes requisitos:

Uso

É necessário que o reprodutor de áudio tenha o uso definido como USAGE_MEDIA, USAGE_GAME ou USAGE_UNKNOWN.

Política de captura

A política de captura do reprodutor 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.

Desativar a captura do sistema

As proteções que permitem a captura descrita acima só se aplicam a apps. Os componentes do sistema Android ignoram essas restrições e podem capturar reproduções por padrão. Muitos desses componentes são personalizados pelos fornecedores do Android e são compatíveis com recursos como acessibilidade e legendas. Por isso, recomendamos que os apps permitam que o sistema capture as reproduções deles. 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.

Definir a política no tempo de execução

É possível chamar AudioManager.setAllowedCapturePolicy() para alterar a política de captura enquanto um app está em execução. Se um MediaPlayer ou AudioTrack estiver reproduzindo um áudio quando você chamar o método, esse áudio não será afetado. Será necessário fechar e reabrir o reprodutor ou a faixa para que a alteração 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 em vigor é determinada. A política de captura aplicada é sempre a mais restritiva. Por exemplo, um app cujo manifesto inclua setAllowedCapturePolicy="false" nunca permitirá que apps que não sejam do sistema capturem o áudio dele, mesmo que a AudioManager#setAllowedCapturePolicy esteja definida como ALLOW_CAPTURE_BY_ALL. Da mesma forma, se a AudioManager#setAllowedCapturePolicy for definida como ALLOW_CAPTURE_BY_ALL, e o manifesto definir setAllowedCapturePolicy="true", mas os AudioAttributes do reprodutor de mídia tiverem sido criados com AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), o reprodutor 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 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