Una app puede grabar el video o audio que se reproduce desde otra app. Tales
las apps deben administrar
Token MediaProjection
correctamente. En esta página, se explica cómo hacerlo. También se muestra cómo un administrador de dispositivos puede inhabilitar
la capacidad de grabar instantáneas de la pantalla, y cómo una app de audio puede evitar
otras apps para que no graben el contenido que reproduce.
Cómo controlar un token MediaProjection
La API de MediaProjection
permite que las apps adquieran un token de MediaProjection
que les da acceso por única vez
para capturar contenido de la pantalla o audio. El SO Android le solicita al usuario su
permiso antes de otorgar el token a tu app.
El SO muestra los tokens MediaProjection
activos en la IU de Configuración rápida y
permite que los usuarios retiren el acceso a un token en cualquier momento. Cuando esto sucede, los
pantallas virtuales o transmisiones de audio asociadas con la sesión que dejará de recibir
transmisiones continuas de contenido multimedia. Tu app debe responder adecuadamente; de lo contrario, continuará
para grabar silencio de audio o una transmisión de video por Internet en negro.
Para controlar la pérdida de un token, registra una devolución de llamada en el MediaProjection
.
con la
registerCallback
método y detendrás el registro cuando
onStop
método.
Para obtener más información, consulta Proyección de contenido multimedia.
Capturar video
Consulta la App de ejemplo ScreenCapture cómo usar la API de proyección de contenido multimedia para capturar la en tiempo real y mostrarlos en una SurfaceView.
Puedes usar la DevicePolicyManager
para evitar la grabación de pantalla. Para cuentas empresariales (Android for Work),
el administrador puede inhabilitar la recopilación de datos del asistente para el perfil de trabajo
mediante
setScreenCaptureDisabled
.
El codelab Cómo administrar dispositivos Android sin una app se muestra cómo prohibir las capturas de pantalla.
Cómo capturar la reproducción de audio
La API de AudioPlaybackCapture se introdujo en Android 10. Esta API da a las apps la capacidad de copiar el audio que reproducen otras apps. Esta es la análoga de la captura de pantalla, pero para audio. El caso de uso principal es para apps de streaming que quieran capturar el audio que reproducen los juegos.
Ten en cuenta que la API de AudioPlaybackCapture no afecta la latencia de la app cuyo audio se que se está capturando.
Cómo compilar una app de captura
Por cuestiones de seguridad y privacidad, la captura de reproducción impone algunas limitaciones. Para poder capturar audio, una app debe cumplir con estos requisitos:
- La app debe tener la
RECORD_AUDIO
permiso. - La app debe mostrar la solicitud que muestra
MediaProjectionManager.createScreenCaptureIntent()
: y el usuario debe aprobarla. - Las apps de captura y reproducción deben estar en el mismo perfil de usuario.
Para capturar audio de otra app, la app debe crear un
Objeto AudioRecord
y agrega
AudioPlaybackCaptureConfiguration
que se les asigna. Sigue estos pasos:
- Llama a
AudioPlaybackCaptureConfiguration.Builder.build()
para crear unAudioPlaybackCaptureConfiguration
- Para pasar la configuración a
AudioRecord
, llama asetAudioPlaybackCaptureConfig
Cómo controlar la captura de audio
Tu app puede controlar qué tipos de contenido puede grabar y qué otro de apps pueden grabar su propia reproducción.
Cómo restringir la captura por contenido de audio
Una app puede limitar el audio que puede capturar usando estos métodos:
- Pasa un
AUDIO_USAGE
a AudioPlaybackCaptureConfiguration.addMatchingUsage(). para permitir la captura de un uso específico. Para especificar más de un uso, debes llamar al método varias veces. - Pasa un elemento
AUDIO_USAGE
a AudioPlaybackCaptureConfiguration.ExcludeUsage() para lo siguiente: prohibir que se capte ese uso. Para especificar más de un uso, debes llamar al método varias veces. - Cómo pasar un UID a AudioPlaybackCaptureConfiguration.addMatchingUid() para capturar apps solo con un UID específico. Llama al método varias veces para especificar más de un UID.
- Inclusión de un UID en AudioPlaybackCaptureConfiguration.excludeUid() para prohibir la captura de ese UID. Para especificar más de un UID, debes llamar al método varias veces.
Ten en cuenta que no puedes usar los métodos addMatchingUsage()
y excludeUsage()
entre sí. Debes elegir uno u otro. Del mismo modo, no puedes usar addMatchingUid()
ni excludeUid()
al mismo tiempo.
Cómo restringir la captura por parte de otras apps
Puedes configurar una app para evitar que otras apps capturen su audio. El audio proveniente de una app solo puede capturarse si la app cumple con los siguientes requisitos:
Uso
El reproductor que produce el audio debe configurar su uso.
para USAGE_MEDIA
,
USAGE_GAME
o
USAGE_UNKNOWN
.
Política de captura
La política de captura del jugador debe
AudioAttributes.ALLOW_CAPTURE_BY_ALL
:
lo que permite que otras apps capturen la reproducción. Esto se puede realizar de diversas maneras:
- Para que todos los reproductores puedan realizar capturas, incluye
android:allowAudioPlaybackCapture="true"
en la app archivomanifest.xml
. - También puedes llamar a todos los jugadores para habilitar la captura
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
- Puedes establecer la política en un reproductor individual cuando la compilas con
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
(Si usasAAudio
, llamaAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
).
Si se cumplen estos requisitos previos, se puede capturar cualquier audio que genere el reproductor.
Cómo inhabilitar la captura del sistema
Las protecciones descritas anteriormente que permiten la captura solo se aplican a apps. En Android
los componentes del sistema pueden capturar la reproducción de forma predeterminada.
Muchos de estos componentes son personalizados por proveedores de Android y las funciones de compatibilidad.
como la accesibilidad y los subtítulos. Por este motivo, se recomienda que las apps
permitir que el sistema capture su reproducción. En el caso poco probable de que no
Si quieres que el sistema capture la reproducción de tu app, establece la política de captura en
ALLOW_CAPTURE_BY_NONE
Cómo configurar la política en el tiempo de ejecución
Puedes llamar a AudioManager.setAllowedCapturePolicy()
para cambiar la captura.
política mientras se ejecuta una app. Si se está reproduciendo un elemento MediaPlayer o AudioTrack
cuando llamas al método, el audio no se ve afectado. Debes cerrar y volver a abrir
con el reproductor o la pista para que se aplique el cambio de política.
Política = Manifiesto + AudioManager + AudioAttributes
Como la política de captura puede especificarse en varios lugares, es importante
para entender cómo se determina
la política vigente.
Siempre se aplica la política de captura más restrictiva. Por ejemplo, una app cuyo
el manifiesto incluya setAllowedCapturePolicy="false"
nunca permitirá que los archivos que no
para capturar audio, incluso si se establece AudioManager#setAllowedCapturePolicy
a ALLOW_CAPTURE_BY_ALL
. De manera similar, si el
AudioManager#setAllowedCapturePolicy
se establece en ALLOW_CAPTURE_BY_ALL
, y la
el manifiesto establece setAllowedCapturePolicy="true"
, pero el nombre del
AudioAttributes
se crearon con
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
y, luego,
Las apps ajenas al sistema no podrán capturar este reproductor multimedia.
En la siguiente tabla, se resumen los efectos del atributo del manifiesto y de las política vigente:
allowAudioPlaybackCapture | ALLOW_CAPTURE_BY_ALL | ALLOW_CAPTURE_BY_SYSTEM | ALLOW_CAPTURE_BY_NONE |
---|---|---|---|
true | cualquier app | apps del sistema únicamente | ninguna captura |
false | apps del sistema únicamente | apps del sistema únicamente | ninguna captura |