La API de AudioPlaybackCapture se presentó en Android 10. Esta API otorga a las apps la capacidad de copiar el audio que reproducen otras apps. Esta función es análoga a la captura de pantalla, pero para audio. El principal caso de uso incluye las apps de transmisión que requieren capturar el audio que reproducen los juegos.
Ten en cuenta que la API de captura no afecta la latencia de la app cuyo audio se está capturando.
Cómo compilar una app de captura
Requisitos previos
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 el permiso
RECORD_AUDIO
. - La app debe abrir 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.
Cómo capturar audio
Para capturar audio de otra app, la app debe crear un objeto AudioRecord
y agregarle un elemento AudioPlaybackCaptureConfiguration
. Sigue estos pasos:
- Llama a
AudioPlaybackCaptureConfiguration.Builder.build()
para crear un elementoAudioPlaybackCaptureConfiguration
. - Transfiere la configuración a
AudioRecord
mediante una llamada asetAudioPlaybackCaptureConfig
.
Cómo restringir la captura por contenido de audio
Una app puede limitar el audio que puede capturar mediante estos métodos:
- Transfiere un elemento
AUDIO_USAGE
a AudioPlaybackCaptureConfiguration.addMatchingUsage() para permitir la captura de un uso específico. Llama al método varias veces para especificar más de un uso. - Transfiere un elemento
AUDIO_USAGE
a AudioPlaybackCaptureConfiguration.excludeUsage() para prohibir la captura de ese uso. Llama al método varias veces para especificar más de un uso. - Transfiere un UID a AudioPlaybackCaptureConfiguration.addMatchingUid() para capturar solamente las apps con un UID específico. Llama al método varias veces para especificar más de un UID.
- Transfiere un UID a AudioPlaybackCaptureConfiguration.excludeUid() para prohibir la captura de ese UID. Llama al método varias veces para especificar más de un UID.
Ten en cuenta que no puedes usar los métodos addMatchingUsage()
y excludeUsage()
juntos. Debes elegir uno u otro. Del mismo modo, no puedes usar addMatchingUid()
y excludeUid()
al mismo tiempo.
Cómo permitir la captura de reproducción
Puedes configurar una app para evitar que otras apps capturen su audio. Solo se puede capturar el audio procedente de una app si esta cumple con estos requisitos:
Uso
El reproductor que produce el audio debe establecer su de 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 cual permite que otras apps capturen la reproducción. Esto se puede realizar de diversas maneras:
- Para habilitar la captura en todos los reproductores, incluye
android:allowAudioPlaybackCapture="true"
en el archivomanifest.xml
de la app. - También puedes habilitar la captura en todos los reproductores mediante una llamada a
AudioManager.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. - Puedes establecer la política en un reproductor individual durante su creación mediante
AudioAttributes.Builder.setAllowedCapturePolicy(AudioAttributes.ALLOW_CAPTURE_BY_ALL)
. (Si usasAAudio
, llama aAAudioStreamBuilder_setAllowedCapturePolicy(AAUDIO_ALLOW_CAPTURE_BY_ALL)
).
Si se cumplen estos requisitos previos, es posible capturar todo el audio que produce el reproductor.
Cómo inhabilitar la captura del sistema
Las protecciones descritas anteriormente que permiten la captura solo se aplican a apps. Los componentes del sistema Android pueden capturar reproducción de forma predeterminada. La personalización de muchos de estos componentes está a cargo de los proveedores Android, y se admiten funciones como la accesibilidad y los subtítulos. Por este motivo, se recomienda que las apps permitan al sistema capturar su reproducción. En el caso excepcional de que no desees 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 política de captura mientras se ejecuta una app. Si MediaPlayer o AudioTrack se encuentran en reproducción al llamar al método, el audio no se ve afectado. Debes cerrar y volver a abrir el reproductor o la pista para que se implemente el cambio de política.
Política = Manifiesto + AudioManager + AudioAttributes
Como la política de captura se puede especificar en varias ubicaciones, es importante comprender la forma en que se determina la política vigente. Siempre se aplica la política de captura más restrictiva. Por ejemplo, una app con un manifiesto que incluya setAllowedCapturePolicy="false"
nunca permitirá que apps externas al sistema capturen su audio, aunque AudioManager#setAllowedCapturePolicy
se haya establecido en ALLOW_CAPTURE_BY_ALL
. De forma similar, si se establece AudioManager#setAllowedCapturePolicy
en ALLOW_CAPTURE_BY_ALL
y el manifiesto contiene setAllowedCapturePolicy="true"
, pero los elementos AudioAttributes
del reproductor multimedia se crearon con AudioAttributes.Builder#setAllowedCapturePolicy(ALLOW_CAPTURE_BY_SYSTEM)
, las apps externas al sistema no podrán capturar 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 | any app | system only | no capture |
false | system only | system only | no capture |