MediaSession es un componente del framework Android para gestionar la reproducción de contenido multimedia e integrarse con dispositivos externos. Proporciona una interfaz unificada para interactuar con auriculares Bluetooth, cascos, Android Auto y el centro multimedia del sistema. Según Android Developers Guide, 2026, MediaSession reemplaza al obsoleto RemoteControlClient y es obligatorio para reproductores que se sincronizan con el sistema.
Ideas clave
MediaSession es un componente del sistema Android que permite a una aplicación declarar su actividad multimedia y recibir comandos de control desde fuentes externas. Cuando el usuario presiona el botón Play en un auricular Bluetooth, el sistema transmite este evento a la MediaSession activa, y la aplicación responde a través de su Callback.
Antes de Android 5.0, se usaba RemoteControlClient para este propósito, pero no brindaba suficiente flexibilidad ni soportaba escenarios modernos como Android Auto, relojes inteligentes y altavoces inteligentes. MediaSession se introdujo en API 21 y se convirtió en el estándar de facto para todas las aplicaciones Android con reproducción de audio y video.
Según la documentación para desarrolladores de Android (2026), una aplicación debe crear una MediaSession por cada fuente de reproducción independiente. En un momento dado, solo una sesión puede estar activa; cualquier sesión nueva desactiva automáticamente la anterior.
La combinación de MediaSession con MediaBrowserService proporciona un ciclo completo de gestión multimedia: el servicio ofrece un árbol de contenido (listas de reproducción, catálogos) y la sesión acepta comandos de navegación y reproducción. Esta es la arquitectura recomendada por Google para reproductores de música, podcasts y audiolibros.
MediaBrowserService se ejecuta como un servicio en primer plano con una notificación, lo que garantiza que la aplicación siga funcionando incluso si se destruye la Activity. Esto es fundamental para los reproductores de audio que deben seguir reproduciendo cuando la aplicación está minimizada.
La sesión admite dos tipos de interacción: recibe comandos de MediaController (el lado cliente) y transmite el estado a través de PlaybackState. MediaController puede estar en el mismo proceso o en una aplicación separada; el sistema enruta las solicitudes mediante SessionToken.
Cuando el usuario llama al asistente de voz de Android y dice “Reproduce la siguiente canción”, el sistema encuentra la MediaSession activa a través de su conexión con MediaBrowserService y envía el comando ACTION_SKIP_TO_NEXT. El Callback de la aplicación recibe la llamada onSkipToNext() y actualiza PlaybackState.
La actualización de PlaybackState mediante setPlaybackState() notifica inmediatamente a todas las instancias de MediaController conectadas. El centro multimedia del sistema, el dispositivo Bluetooth y Android Auto reciben la actualización simultáneamente; el retraso no supera los 50 ms en condiciones normales.
PlaybackState contiene indicadores de estado clave: isPlaying, posición, velocidad, acciones disponibles (play, pause, seek, stop). Sin un PlaybackState correctamente definido, el sistema no sabe qué comandos admite la aplicación y no envía los eventos correspondientes.
Los metadatos (MediaMetadata) complementan el estado con información sobre la pista actual: título, artista, URI de la carátula. Android Auto y los relojes inteligentes usan MediaMetadata para mostrar información en pantalla. Según Google I/O 2024, una correcta definición de MediaMetadata aumenta la visibilidad de la aplicación en lanzadores de terceros en un 40%.
La arquitectura de MediaSession consta de cuatro componentes interconectados, cada uno con su propia función. El desarrollador debe implementar los cuatro para una integración completa con el sistema.
La sesión se crea en el método onCreate de un servicio o Activity llamando a MediaSessionCompat(context, tag). Después de la creación, se debe llamar a setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS). En onDestroy, se llama a release() para liberar los recursos del sistema.
La gestión incorrecta del ciclo de vida es uno de los errores más comunes. Si no se llama a release(), la sesión permanece en el sistema y la siguiente aplicación podría recibir un estado obsoleto. Android 13+ muestra una advertencia en Logcat ante fugas de sesiones.
La integración básica comienza creando una sesión e implementando un Callback. Se recomienda usar MediaSessionCompat de la biblioteca AndroidX media, que proporciona una API unificada para todas las versiones de Android, desde API 14 hasta 35.
class MusicService : Service() {
private lateinit var mediaSession: MediaSessionCompat
private lateinit var stateBuilder: PlaybackStateCompat.Builder
override fun onCreate() {
super.onCreate()
mediaSession = MediaSessionCompat(this, "MusicService")
mediaSession.setFlags(
MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS
or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS
)
mediaSession.setCallback(MediaSessionCallback())
updatePlaybackState(false)
}
private inner class MediaSessionCallback : MediaSessionCompat.Callback() {
override fun onPlay() {
updatePlaybackState(true)
}
override fun onPause() {
updatePlaybackState(false)
}
}
private fun updatePlaybackState(isPlaying: Boolean) {
stateBuilder = PlaybackStateCompat.Builder()
.setState(
if (isPlaying) PlaybackStateCompat.STATE_PLAYING
else PlaybackStateCompat.STATE_PAUSED,
AudioTrackCompat.CURRENT_POSITION_NOT_SET,
1.0f
)
.setActions(
PlaybackStateCompat.ACTION_PLAY
or PlaybackStateCompat.ACTION_PAUSE
or PlaybackStateCompat.ACTION_SKIP_TO_NEXT
or PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS
)
mediaSession.setPlaybackState(stateBuilder.build())
}
override fun onDestroy() {
mediaSession.release()
super.onDestroy()
}
}
En este ejemplo, se crea una MediaSession con la etiqueta MusicService y los indicadores para manejar botones multimedia. El Callback implementa onPlay y onPause, actualizando PlaybackState. El método setActions declara las acciones disponibles que el sistema muestra en la pantalla de bloqueo y en el centro multimedia.
private fun setMetadata(title: String, artist: String) {
val metadata = MediaMetadataCompat.Builder()
.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)
.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)
.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, 300000L)
.putString(MediaMetadataCompat.METADATA_KEY_ALBUM_ART_URI, albumArtUrl)
.build()
mediaSession.setMetadata(metadata)
}
Los metadatos deben actualizarse en cada cambio de pista. El sistema usa METADATA_KEY_TITLE y METADATA_KEY_ARTIST para mostrar información en las pantallas Bluetooth de los automóviles y en dispositivos wearables. Si no se establece el URI de la carátula, el reproductor mostrará un marcador de posición gris.
Los auriculares Bluetooth envían comandos a través del perfil AVRCP 1.6+. Android transmite estos comandos como intents ACTION_MEDIA_BUTTON, que son interceptados por MediaSession cuando se establece el indicador FLAG_HANDLES_MEDIA_BUTTONS.
Cuando el usuario presiona el botón Play en unos auriculares Bluetooth, el sistema crea un KeyEvent con el código KEYCODE_MEDIA_PLAY, que se envía al método onMediaButtonEvent del Callback. Si en el Callback está implementado onPlay(), el sistema lo llama directamente. Una sola pulsación del botón del auricular envía KEYCODE_MEDIA_PLAY_PAUSE; el reproductor debe alternar el estado.
Los auriculares Bluetooth modernos pueden tener hasta 5 botones: volumen +/-, play/pause, siguiente, anterior. Cada botón genera su propio KeyEvent, que debe ser manejado correctamente por el Callback. Una doble pulsación de play/pause generalmente se interpreta como saltar a la siguiente pista (ACTION_SKIP_TO_NEXT) en muchos auriculares.
Según el Documento de Definición de Compatibilidad de Android (2026), todas las aplicaciones con contenido multimedia deben manejar correctamente KEYCODE_MEDIA_PLAY_PAUSE. Ignorar este requisito conlleva una disminución automática de la calificación en Google Play para la categoría Música y Audio.
A partir de Android 11, el centro multimedia del sistema (Panel de Control Multimedia) muestra hasta 5 sesiones recientes de MediaSession en el panel de notificaciones. El usuario puede controlar el reproductor sin abrir la aplicación. Para una visualización correcta, es necesario implementar MediaBrowserService y definir correctamente PlaybackState.
El Panel de Control Multimedia muestra: título de la pista, artista, carátula (de MediaMetadata) y botones de control (de las acciones disponibles en PlaybackState). Si la aplicación no actualiza PlaybackState al menos una vez cada 10 segundos durante la reproducción activa, el centro multimedia oculta la sesión del panel.
private fun startForegroundService() {
val notification = NotificationCompat.Builder(this, "media_channel")
.setSmallIcon(R.drawable.ic_play)
.setContentTitle("Reproduciendo ahora")
.setContentText(currentTrackTitle)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSession.sessionToken)
)
.build()
startForeground(1001, notification)
}
La notificación MediaStyle se vincula a MediaSession a través del sessionToken y muestra los botones multimedia estándar. Sin MediaStyle, la notificación aparecerá como una alerta normal sin botones de control. Android 13+ requiere el permiso explícito POST_NOTIFICATIONS para mostrarse.
Preguntas frecuentes
Técnicamente sí, pero solo una sesión se considera activa en un momento dado. Al crear una nueva sesión sin llamar a setActive(true), la anterior permanece activa. Se recomienda tener una sesión por aplicación o una por cada fuente de audio independiente con conmutación del estado activo.
MediaSession no gestiona Audio Focus automáticamente; es un mecanismo separado. Al recibir un comando onPlay, el desarrollador debe solicitar AudioFocus a través de AudioManager de forma independiente, y al perder el foco, pausar la reproducción mediante la sesión.
Verifica que los indicadores FLAG_HANDLES_MEDIA_BUTTONS y FLAG_HANDLES_TRANSPORT_CONTROLS estén establecidos. También asegúrate de que la sesión esté activa (setActive(true)). En Android 12+, los botones multimedia solo funcionan a través de MediaSession; el antiguo registerMediaButtonEventReceiver no es compatible.
Para el manejo básico de botones, no. Pero para la integración con Android Auto, Wear OS y el centro multimedia del sistema, se requiere MediaBrowserService. Google recomienda implementar MediaBrowserService en todas las aplicaciones con reproducción de audio prolongada.
Usa el comando adb shell dumpsys media_session para ver las sesiones activas, sus Callbacks y PlaybackState. Esta utilidad muestra todas las sesiones registradas con su etiqueta, actividad y último estado conocido; una herramienta conveniente para depuración.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también