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 oferece 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 seu app.
O SO mostra os tokens MediaProjection
ativos na interface de 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. 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 a reprodução de áudio
A API AudioPlaybackCapture foi introduzida no Android 10. Com essa API, é possível copiar o áudio que está sendo reproduzido por outros apps. Esse recurso é o análogo da 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á 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 o áudio de outro app, você 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 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()
juntos. É 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
para 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 player individual ao criá-la 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 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 um MediaPlayer ou AudioTrack estiver sendo reproduzido
quando você chamar o método, o áudio não será afetado. Feche e reabra
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 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
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 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 |