Um app pode gravar o vídeo ou o áudio que está sendo reproduzido por outro app. Esses
apps precisam 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 fornece acesso único
para capturar o áudio ou o conteúdo da tela. O SO Android solicita a permissão do usuário antes de conceder o token ao app.
O SO exibe 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
streamings de mídia. Seu app precisa responder adequadamente. Caso contrário, ele continuará
gravando em silêncio de áudio ou um stream de vídeo preto.
Para lidar com 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.
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 da 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 apresentada no Android 10. Essa API oferece aos apps a capacidade de copiar o áudio que está sendo reproduzido por outros apps. Esse recurso é parecido com a 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.
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:
- O app precisa ter a
permissão
RECORD_AUDIO
. - O app precisa exibir a solicitação exibida por
MediaProjectionManager.createScreenCaptureIntent()
, e o usuário precisa aprová-la. - Os aplicativos 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
AudioRecord
chamandosetAudioPlaybackCaptureConfig
.
Como controlar a captura de áudio
Seu app pode controlar quais tipos de conteúdo ele 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 o áudio que pode ser capturado usando estes métodos:
- Transmita um
AUDIO_USAGE
para AudioPlaybackCaptureConfiguration.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_USAGE
para AudioPlaybackCaptureConfiguration.exclusionUsage() 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 uma dessas opções. Da mesma forma, não é possível usar addMatchingUid()
e excludeUid()
ao mesmo tempo.
Restringindo 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:
- Para ativar a captura em todos os players, inclua
android:allowAudioPlaybackCapture="true"
no arquivomanifest.xml
do app. - Também é possível ativar a captura em todos os jogadores chamando
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Você pode definir a política em um player individual usando
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. Se você estiver usandoAAudio
, chameAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
.
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 pelos 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 tocando
quando você chama o método, o áudio não vai ser afetado. Feche e reabra
o player ou a faixa para que a mudança 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
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 vai permitir que apps que não sejam do sistema
capturem á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)
, 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 a 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 |