Um app pode gravar o vídeo ou áudio que está sendo reproduzido em outro app. Esses
apps precisam processar o token
MediaProjection
corretamente. Nesta página, explicamos como fazer isso. Ele também mostra como um administrador de dispositivo pode desativar
a capacidade de gravar capturas de 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 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 de configurações rápidas e
permite que os usuários revoguem 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 adequadamente. Caso contrário, ele vai continuar gravando silêncio ou um fluxo de vídeo preto.
Para processar a perda de um token, registre um callback na instância MediaProjection
usando o método
registerCallback
e pare de gravar quando o método
onStop
for chamado.
Para mais informações, consulte Projeção de mídia.
Capturar vídeo
Você pode usar o DevicePolicyManager
para evitar a gravação de tela. Para contas corporativas (Android for Work), o administrador pode desativar a coleta de dados do Google Assistente no 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 reproduzido por outros apps. Esse recurso é semelhante à captura de tela, mas para áudio. O principal caso de uso é para apps de streaming que querem capturar o áudio que está sendo reproduzido por jogos.
A API AudioPlaybackCapture não afeta a latência do app cujo áudio está sendo capturado.
Criar um app de captura
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:
- O app precisa ter a
permissão
RECORD_AUDIO. - O app precisa mostrar o comando exibido por
MediaProjectionManager.createScreenCaptureIntent(), e o usuário precisa aprovar. - Os apps de captura e reprodução precisam estar no mesmo perfil de usuário.
Para capturar áudio de outro app, seu app precisa criar um objeto
AudioRecord
e adicionar um
AudioPlaybackCaptureConfiguration
a ele. Siga estas etapas:
- Chame
AudioPlaybackCaptureConfiguration.Builder.build()para criar umAudioPlaybackCaptureConfiguration. - Transmita a configuração para o
AudioRecordchamandosetAudioPlaybackCaptureConfig.
Controlar a captura de áudio
Seu app pode controlar os tipos de conteúdo que pode gravar e quais outros tipos de app podem gravar a própria reprodução.
Restringir a captura por conteúdo de áudio
Um app pode limitar o áudio que pode capturar usando estes métodos:
- Transmita um
AUDIO_USAGEpara AudioPlaybackCaptureConfiguration.Builder.addMatchingUsage() para permitir a captura de um uso específico. Chame o método várias vezes para especificar mais de um uso. - Transmita um
AUDIO_USAGEpara AudioPlaybackCaptureConfiguration.excludeUsage() para proibir a captura desse uso. Chame o método várias vezes para especificar mais de um uso. - Transmita um UID para AudioPlaybackCaptureConfiguration.addMatchingUid() para capturar apenas apps com um UID específico. Chame o método várias vezes para especificar mais de um UID.
- Transmita um UID para AudioPlaybackCaptureConfiguration.excludeUid() para proibir a captura desse UID. Chame o método várias vezes para especificar mais de um UID.
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.
Restringir a captura por outros apps
É 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
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:
- Para ativar a captura em todos os jogadores, inclua
android:allowAudioPlaybackCapture="true"no arquivomanifest.xmldo app. - Também é possível ativar a captura em todos os players chamando
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - É possível definir a política em um jogador individual ao criá-lo usando
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Se você estiver usandoAAudio, ligue paraAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL).)
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 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 legendas. Por isso, é recomendável que os apps
permitam que o sistema capture a reprodução. Em casos raros, quando 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
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 em reprodução
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 lugares, é importante entender como a política efetiva é determinada.
A política de captura aplicada é sempre a mais restritiva. Por exemplo, um app cujo
manifesto inclui setAllowedCapturePolicy="false" nunca vai permitir que apps
não relacionados ao sistema capturem o áudio, mesmo que AudioManager#setAllowedCapturePolicy esteja definido
como ALLOW_CAPTURE_BY_ALL. Da mesma forma, se o
AudioManager#setAllowedCapturePolicy estiver definido como ALLOW_CAPTURE_BY_ALL e o
manifesto definir setAllowedCapturePolicy="true", mas os
AudioAttributes do player de mídia tiverem sido criados 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 são do sistema.
A tabela abaixo resume o efeito do atributo de manifesto e da 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 |