Una app puede grabar el video o el audio que se reproduce desde otra app. Estas
apps deben controlar el
MediaProjection token
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 cualquier captura de pantalla y cómo una app de audio puede evitar que otras apps graben el contenido que reproduce.
Cómo controlar un token MediaProjection
La MediaProjection API
permite que las apps adquieran un token MediaProjection que les otorga acceso único
para capturar el contenido de la pantalla o el audio. El SO Android le pide permiso al usuario 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, las pantallas virtuales o las transmisiones de audio asociadas con la sesión dejan de recibir transmisiones de contenido multimedia. Tu app debe responder de manera adecuada; de lo contrario, seguirá grabando silencio de audio o una transmisión de video negra.
Para controlar la pérdida de un token, registra una devolución de llamada en la MediaProjection
instancia con el
registerCallback
método y detén la grabación cuando se llame al
onStop
método.
Para obtener más información, consulta Proyección de contenido multimedia.
Capturar video
Consulta la app de ejemplo ScreenCapture para aprender a usar la API de proyección de contenido multimedia para capturar la pantalla de un dispositivo en tiempo real y mostrarla en una SurfaceView.
Puedes usar el DevicePolicyManager
para evitar la grabación de pantalla. En el caso de las cuentas empresariales (Android for Work), el
administrador puede inhabilitar la recopilación de datos del Asistente en el perfil de trabajo
con el
método setScreenCaptureDisabled.
En el codelab Cómo administrar dispositivos Android sin una app , se muestra cómo prohibir las capturas de pantalla.
Capturar la reproducción de audio
La API de AudioPlaybackCapture se introdujo en Android 10. Esta API proporciona a las apps la capacidad de copiar el audio que reproducen otras apps. Esta función es la análoga de la captura de pantalla, pero para audio. El caso práctico principal es para las apps de streaming que quieren capturar el audio que reproducen los juegos.
Ten en cuenta que la API de AudioPlaybackCapture no afecta la latencia de la app de la cual se está capturando el audio.
Cómo crear una app de captura
Por cuestiones de seguridad y privacidad, la captura de la reproducción tiene algunas limitaciones. Para poder capturar audio, una app debe cumplir con los siguientes requisitos:
- La app debe tener el
RECORD_AUDIOpermiso. - La app debe mostrar la solicitud emitida por
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, tu app debe compilar un
AudioRecord objeto
y agregarle un
AudioPlaybackCaptureConfiguration. Lleve a cabo los pasos siguientes:
- Llama a
AudioPlaybackCaptureConfiguration.Builder.build()para compilar unAudioPlaybackCaptureConfiguration. - Pasa la configuración a
AudioRecordllamando asetAudioPlaybackCaptureConfig.
Cómo controlar la captura de audio
Tu app puede controlar qué tipos de contenido puede grabar y qué otros tipos de apps pueden grabar su propia reproducción.
Cómo limitar la captura por contenido de audio
Una app puede limitar qué audio puede capturar con estos métodos:
- Inclusión de un
AUDIO_USAGEen 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. - Inclusión de un
AUDIO_USAGEen AudioPlaybackCaptureConfiguration.excludeUsage() para prohibir la captura de ese uso. Para especificar más de un uso, debes llamar al método varias veces. - Inclusión de un UID en AudioPlaybackCaptureConfiguration.addMatchingUid() para capturar apps con un UID específico únicamente. Para especificar más de un UID, debes llamar al método varias veces.
- 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() juntos. Debes elegir uno de los dos. Del mismo modo, no puedes usar addMatchingUid() y excludeUid() al mismo tiempo.
Cómo limitar la captura por 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 establecer su uso
en USAGE_MEDIA,
USAGE_GAME o
USAGE_UNKNOWN.
Política de captura
La política de captura del reproductor debe ser
AudioAttributes.ALLOW_CAPTURE_BY_ALL,
lo que permite que otras apps capturen la reproducción. y puede establecerse de varias maneras:
- Para permitir que todos los reproductores puedan realizar capturas, incluye
android:allowAudioPlaybackCapture="true"en el archivomanifest.xmlde la app. - También puedes permitir que todos los reproductores puedan realizar capturas si llamas a
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). - Puedes establecer la política en un reproductor individual durante la compilación por medio de
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL). (Si usasAAudio, llama aAAudioStreamBuilder_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 que permiten la captura descrita más arriba solo se aplican a apps. Los componentes del sistema Android pueden capturar la reproducción de manera predeterminada.
Muchos de estos componentes están personalizados por proveedores de Android y admiten funciones como la accesibilidad y la incorporación de subtítulos. Por este motivo, se recomienda que las apps permitan que el sistema capture su reproducción. En los casos poco frecuentes en los que no
quieras que el sistema capture la reproducción de tu app, establece la política en
ALLOW_CAPTURE_BY_NONE.
Cómo establecer una política en el tiempo de ejecución
Puedes llamar a AudioManager.setAllowedCapturePolicy() para cambiar la política de captura cuando una app está en ejecución. Si un reproductor multimedia o una pista de audio está en ejecución cuando llamas al método, el audio no se verá afectado. Deberás cerrar y volver a abrir el reproductor o la pista para que se implemente la política.
Política = manifiesto + AudioManager + AudioAttributes
Como la política de captura puede especificarse en varios lugares, es importante que comprendas cómo se determina la política vigente.
Siempre se aplica la política de captura más restrictiva. Por ejemplo, una app cuyo
manifiesto incluye setAllowedCapturePolicy="false" nunca permitirá que las apps ajenas al sistema
capturen su audio, incluso si AudioManager#setAllowedCapturePolicy está configurado
como ALLOW_CAPTURE_BY_ALL. Del mismo modo, si el
AudioManager#setAllowedCapturePolicy está configurado como ALLOW_CAPTURE_BY_ALL y el
manifiesto establece setAllowedCapturePolicy="true", pero los
AudioAttributes del reproductor multimedia se compilaron con
AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM), las
apps ajenas al sistema no podrán capturar audio de este reproductor multimedia.
En la tabla que se muestra a continuación, se resumen los efectos del atributo del manifiesto y la 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 |