15.1 Grabación de pantalla, streaming y superposiciones
1. Introducción
En Android avanzado, capturar el contenido de la pantalla, enviarlo en tiempo real (streaming)
y superponer elementos sobre otras apps son tareas muy útiles para crear tutoriales,
herramientas de asistencia o aplicaciones de transmisiones en vivo.
2. APIs clave
-
MediaProjection: Permite capturar el framebuffer de la pantalla tras
solicitar el permiso del usuario. -
MediaRecorder / MediaCodec: Codificación de vídeo y audio
en formatos como H.264, AAC. -
VirtualDisplay: Crea una “pantalla virtual” que recibe los fotogramas
capturados por MediaProjection. -
WindowManager ltSYSTEM_ALERT_WINDOWgt: Gestiona superposiciones
(ventanas flotantes) sobre otras aplicaciones.
3. Flujo general de la grabación de pantalla
-
Solicitar permiso al usuario:
startActivityForResult(MediaProjectionManager.createScreenCaptureIntent(), REQUEST_CODE)
-
Obtener MediaProjection:
mediaProjection = projectionManager.getMediaProjection(resultCode, dataIntent)
-
Configurar MediaRecorder / MediaCodec:
- Formato (MPEG_4), bitrate, resolución, frame rate.
- Canal de audio (AudioSource.MIC o AudioSource.VOICE_COMMUNICATION).
-
Crear VirtualDisplay:
mediaProjection.createVirtualDisplay(
ScreenCapture,
width, height, densityDpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
mediaRecorder.getSurface(), null, null) -
Iniciar grabación:
mediaRecorder.start()
- Detener y liberar recursos cuando finalice.
4. Streaming en tiempo real
-
Codificación: Usar MediaCodec en modo configurado para retornar
ByteBuffer codificados. -
Transmisión: Conectar con un servidor RTMP/WebRTC a través de librerías
de terceros (p. ej. libstreaming, rtmp-rtsp-stream-client-java). -
Parámetros de red:
Bitrate vídeo 1000–3000 kbps (adaptive) Resolución 720p o 1080p Frame rate 24–30 fps -
Manejo de errores y reconexión: Implementar callbacks para reconectar
automáticamente ante pérdida de red.
5. Superposiciones (Overlays)
-
Permiso SYSTEM_ALERT_WINDOW:
Debe solicitarse en Settings.ACTION_MANAGE_OVERLAY_PERMISSION.
-
WindowManager.LayoutParams:
- TYPE_APPLICATION_OVERLAY (API ≥ 26)
- Flags: FLAG_NOT_FOCUSABLE, FLAG_LAYOUT_IN_SCREEN, etc.
-
Ejemplos de uso:
- Chat Heads.
- Controles flotantes para zoom o convertir texto.
- Indicadores de grabación (LED rojo).
-
Consideraciones de rendimiento:
- Reducir sobrecarga de dibujo usando Canvas optimizado.
- Evitar layouts complejos mientras se graba/streaming para mantener fps.
6. Buenas prácticas y consejos
- Solicitar y liberar permisos/recursos respetuosamente para no agotar memoria ni batería.
- Mostrar al usuario un indicador claro de que la pantalla está siendo capturada.
- Adaptar la calidad al ancho de banda disponible mediante bitrate adaptation.
- Testear en distintos dispositivos (diferentes dpi, versiones de API).
Profundizando sobre: 15.1 Grabación de pantalla, streaming y superposiciones
Libros recomendados:
- Android Programming: The Big Nerd Ranch Guide (Bill Phillips, Chris Stewart) – capítulo sobre multimedia y APIs de captura.
- Professional Android, 4th Edition (Reto Meier, Ian Lake) – sección sobre MediaProjection y servicios en segundo plano.
- Android Graphics Programming (Wallace Jackson) – explicación de Canvas, SurfaceView y superposiciones.
Recursos en línea:
- Documentación MediaProjection API (Android Developers).
- Guía de ExoPlayer – streaming adaptativo y manejo de superficies.
- Tutorial en Medium: “Recording Your Android Device Screen Using MediaProjection”.
- WebRTC para Android – transmisión en tiempo real con baja latencia.
- Guía CodePath sobre superposiciones con WindowManager.
- Udemy: Android Screen Capture Streaming.
Ejemplos y repositorios:
- Google I/O Schedule – usa MediaProjection en su app de conferencias.
- Android-ChatHead (Roman Nurik) – ejemplo de superposición tipo “chat head”.
- android-ScreenCapture – proyecto de muestra con MediaProjection.
Deja una respuesta