Um app pode gravar o vídeo ou áudio que está sendo reproduzido por outro app. Esses
apps precisam processar o
token MediaProjection
corretamente. Esta página explica como fazer isso. Ele também mostra como um administrador de dispositivos pode desativar
a capacidade de gravar capturas de tela e como um app de áudio pode impedir
que outros apps gravem o conteúdo que ele reproduz.
Como processar um token MediaProjection
A API MediaProjection
permite que os apps adquiram um token MediaProjection
que concede acesso único
para capturar o conteúdo da tela ou o áudio. O SO Android pede permissão ao 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 param de receber
streams de mídia. O app precisa responder corretamente. Caso contrário, ele vai continuar
gravando silêncio de áudio ou uma transmissão de vídeo preta.
Para processar a perda de um token, registre um callback na instância MediaProjection
usando o método
registerCallback
e pare a gravação quando o método
onStop
for chamado.
Para mais informações, consulte Projeção de mídia.
Capturar vídeo
Consulte o app de exemplo ScreenCapture para saber como usar a API Media Projection para capturar a tela de um dispositivo em tempo real e mostrar em um SurfaceView.
Você pode usar o DevicePolicyManager
para impedir 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 Gerenciamento de 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 oferece aos apps a capacidade de copiar o áudio que está sendo reproduzido por outros apps. Esse recurso é o analógico da captura de tela, mas para áudio. O caso de uso principal é para apps de streaming que querem capturar o áudio reproduzido em 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 apresentar 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
O app pode controlar os tipos de conteúdo que 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 o áudio que pode ser capturado usando os seguintes métodos:
- Passe 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. - Passe 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. - Passe 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()
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:
- 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 players chamando
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - É possível definir a política em um reprodutor 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 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 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
.
Como configurar o tempo de execução da política
É possível 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. Será necessário fechar e reabrir
o player 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 mais restritiva é sempre aplicada. Por exemplo, um app cujo
manifesto inclui setAllowedCapturePolicy="false"
nunca permite que apps que não são do sistema
capturam o áudio, mesmo que AudioManager#setAllowedCapturePolicy
seja definido
como ALLOW_CAPTURE_BY_ALL
. Da mesma forma, se o
AudioManager#setAllowedCapturePolicy
for definido como ALLOW_CAPTURE_BY_ALL
e o
manifesto definir setAllowedCapturePolicy="true"
, mas o
AudioAttributes
do player de mídia tiver sido 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 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 |