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. Nesta página, explicamos 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 áudios ou conteúdos da tela. O SO Android pede ao usuário
antes de conceder o token ao aplicativo.
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. 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 evitar a gravação da 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. Esta API permite que os aplicativos copiem o áudio que está sendo tocado por outros aplicativos. Isso é análogo à captura de tela, mas para áudio. O caso de uso principal é para apps de streaming que querem capturar o áudio de 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 o
RECORD_AUDIO
permissão. - O app precisa mostrar o comando que aparece
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:
- Chamar
AudioPlaybackCaptureConfiguration.Builder.build()
para criarAudioPlaybackCaptureConfiguration
- Transmita a configuração para
AudioRecord
chamandosetAudioPlaybackCaptureConfig
.
Como controlar a captura de áudio
Seu app pode controlar os tipos de conteúdo que pode gravar e que outros tipos de aplicativo 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.excludeUsage() para proíbem 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 produz o áudio precisa definir o 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
,
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 usando a chamadaAAudio
AAudioStreamBuilder_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. Android
componentes do sistema 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 legendagem. Por isso, é recomendável que os apps
permitem que o sistema capture a reprodução. No caso raro 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 captura
política enquanto um app está em execução. Se estiver tocando um MediaPlayer ou AudioTrack
ao chamar o método, o áudio não é 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 aplicativo cujo
manifesto incluir setAllowedCapturePolicy="false"
nunca permitirá que elementos
capturem o áudio, mesmo que AudioManager#setAllowedCapturePolicy
esteja definido
para 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 manifest e os 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 |