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. Esta página explica 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 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 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 fluxos de áudio associados à sessão param de receber
fluxos 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 impedir a gravação de 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. Com essa API, é possível copiar o áudio que está sendo reproduzido por outros apps. Isso é análogo à captura de tela, mas para áudio. O caso de uso principal é para apps de streaming que querem capturar o áudio reproduzido por 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:
- O app precisa ter a
permissão
RECORD_AUDIO
. - O aplicativo deve mostrar a solicitação exibida por
MediaProjectionManager.createScreenCaptureIntent()
, e precisa ser aprovado pelo usuário. - 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 uma
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
O app pode controlar os tipos de conteúdo que ele pode gravar e quais outros tipos de app podem gravar a própria reprodução.
Como restringir a captura por conteúdo de áudio
Um app pode limitar a captura de áudio 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.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.
- Passe 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()
.
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 reproduz o áudio precisa definir o tipo de 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
,
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 tipo arquivomanifest.xml
. - 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 player individual ao criá-la usando o
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 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. Os componentes do sistema
Android podem capturar a reprodução por padrão.
Muitos desses componentes são personalizados por fornecedores do Android e são compatíveis com recursos
como acessibilidade e legendas. Por esse motivo, é recomendável que os apps
permitam que o sistema capture a própria reprodução. 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
.
Como configurar o tempo de execução da política
Chame AudioManager.setAllowedCapturePolicy()
para mudar a política de captura
enquanto um app está em execução. Se estiver tocando um MediaPlayer ou AudioTrack
quando você chamar o método, o áudio não será 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 app cujo
manifesto inclui setAllowedCapturePolicy="false"
nunca permitirá que apps não pertencentes ao sistema
capturem o áudio dele, mesmo que AudioManager#setAllowedCapturePolicy
esteja definido
como 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 do manifesto e a 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 |