MediaSession — concetti chiave, integrazione e meccanismo di funzionamento in Android

Autore: IT Sectr Pubblicato: 2026-05-23 Tempo di lettura: 8 min

MediaSession è un componente del framework Android per gestire la riproduzione di contenuti multimediali e l'integrazione con dispositivi esterni. Fornisce un'interfaccia unificata per interagire con cuffie Bluetooth, Android Auto e il centro multimediale di sistema. Secondo Android Developers Guide, 2026, MediaSession sostituisce il deprecato RemoteControlClient ed è obbligatorio per i lettori che si sincronizzano con il sistema.

Punti chiave

  • MediaSession è il componente centrale per gestire i flussi multimediali in Android, ricevendo comandi da fonti esterne.
  • Supporta Bluetooth AVRCP, cuffie, Android Auto, dispositivi indossabili e il centro multimediale Android.
  • La sessione sincronizza lo stato del lettore (play/pause/next/previous) e i metadati (titolo, artista, copertina) con il sistema.
  • Richiede MediaSessionCompat da AndroidX, che fornisce retrocompatibilità fino all'API 14.
  • Il sistema di callback MediaSession.Callback elabora i comandi in arrivo e modifica lo stato di MediaSession.

Cos'è MediaSession?

MediaSession è un componente di sistema in Android che consente a un'app di dichiarare la propria attività multimediale e ricevere comandi di controllo da fonti esterne. Quando l'utente preme il pulsante Play su un auricolare Bluetooth, il sistema trasmette questo evento alla MediaSession attiva e l'app risponde tramite il suo Callback.

Prima di Android 5.0, RemoteControlClient veniva utilizzato per questo scopo, ma non forniva sufficiente flessibilità e non supportava scenari moderni come Android Auto, smartwatch e smart speaker. MediaSession è stato introdotto nell'API 21 ed è diventato lo standard de facto per tutte le app Android con riproduzione audio e video.

Secondo la documentazione per sviluppatori Android (2026), un'app dovrebbe creare una MediaSession per ogni sorgente di riproduzione indipendente. In qualsiasi momento, solo una sessione può essere attiva — qualsiasi nuova sessione disattiva automaticamente la precedente.

MediaSession e MediaBrowserService

La combinazione di MediaSession con MediaBrowserService fornisce un ciclo completo di gestione multimediale: il servizio fornisce un albero di contenuti (playlist, cataloghi) e la sessione accetta comandi di navigazione e riproduzione. Questa è l'architettura raccomandata da Google per lettori musicali, podcast e audiolibri.

MediaBrowserService viene eseguito come servizio in primo piano con una notifica, garantendo che l'app continui a funzionare anche quando l'Activity viene distrutta. Questo è fondamentale per i lettori audio che devono continuare a riprodurre quando l'app è minimizzata.

Come funziona MediaSession

La sessione supporta due tipi di interazione: riceve comandi da MediaController (il lato client) e trasmette lo stato tramite PlaybackState. MediaController può essere nello stesso processo o in un'app separata — il sistema instrada le richieste tramite SessionToken.

Quando l'utente chiama l'assistente vocale Android e dice “Riproduci il brano successivo”, il sistema trova la MediaSession attiva attraverso la connessione a MediaBrowserService e invia il comando ACTION_SKIP_TO_NEXT. Il Callback dell'app riceve la chiamata onSkipToNext() e aggiorna PlaybackState.

L'aggiornamento di PlaybackState tramite setPlaybackState() notifica immediatamente tutte le istanze MediaController connesse. Il centro multimediale di sistema, il dispositivo Bluetooth e Android Auto ricevono l'aggiornamento simultaneamente — il ritardo non supera i 50 ms in condizioni normali.

PlaybackState e i suoi metadati

PlaybackState contiene flag di stato chiave: isPlaying, posizione, velocità, azioni disponibili (play, pause, seek, stop). Senza un PlaybackState correttamente popolato, il sistema non sa quali comandi l'app supporta e non invia gli eventi corrispondenti.

I metadati (MediaMetadata) completano lo stato con informazioni sul brano corrente — titolo, artista, URI della copertina. Android Auto e gli smartwatch utilizzano MediaMetadata per visualizzare informazioni sullo schermo. Secondo Google I/O 2024, il corretto popolamento di MediaMetadata aumenta la visibilità dell'app nei launcher di terze parti del 40%.

Componenti chiave di MediaSession

L'architettura di MediaSession è composta da quattro componenti interconnessi, ciascuno con il proprio ruolo. Lo sviluppatore deve implementarli tutti e quattro per un'integrazione completa con il sistema.

  • MediaSessionCompat — la classe principale della sessione, creata con un tag app e che accetta un PendingIntent per i pulsanti multimediali.
  • MediaSession.Callback — il gestore dei comandi. Implementa onPlay, onPause, onSkipToNext, onSeekTo e altri metodi.
  • PlaybackStateCompat — lo stato corrente del lettore. Contiene flag, posizione, velocità e l'elenco delle azioni disponibili.
  • MediaMetadataCompat — metadati del contenuto multimediale corrente: titolo, artista, album, copertina, durata.

Ciclo di vita di MediaSession

La sessione viene creata nel metodo onCreate di un servizio o Activity chiamando MediaSessionCompat(context, tag). Dopo la creazione, è necessario chiamare setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS). In onDestroy, viene chiamato release() per liberare le risorse di sistema.

Una gestione errata del ciclo di vita è uno degli errori più comuni. Se release() non viene chiamato, la sessione rimane nel sistema e l'app successiva potrebbe ricevere uno stato obsoleto. Android 13+ mostra un avviso Logcat per perdite di sessione.

Integrazione di MediaSession nell'app

L'integrazione di base inizia con la creazione di una sessione e l'implementazione di un Callback. Si consiglia di utilizzare MediaSessionCompat dalla libreria AndroidX media, che fornisce un'API unificata per tutte le versioni di Android — dall'API 14 alla 35.

Creazione di MediaSession e Callback

kotlin
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()
    }
}

In questo esempio, viene creata una MediaSession con il tag MusicService e flag per gestire i pulsanti multimediali. Il Callback implementa onPlay e onPause, aggiornando PlaybackState. Il metodo setActions dichiara le azioni disponibili che il sistema mostra sulla schermata di blocco e nel centro multimediale.

Impostazione di MediaMetadata

kotlin
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)
}

I metadati dovrebbero essere aggiornati a ogni cambio di brano. Il sistema utilizza METADATA_KEY_TITLE e METADATA_KEY_ARTIST per visualizzare informazioni sui display Bluetooth delle auto e sui dispositivi indossabili. Se l'URI della copertina non è impostato, il lettore mostrerà un segnaposto grigio.

Gestione dei comandi multimediali da Bluetooth e cuffie

I dispositivi Bluetooth inviano comandi tramite il profilo AVRCP 1.6+. Android trasmette questi comandi come intent ACTION_MEDIA_BUTTON, che vengono intercettati da MediaSession quando è impostato il flag FLAG_HANDLES_MEDIA_BUTTONS.

Quando l'utente preme il pulsante Play su cuffie Bluetooth, il sistema crea un KeyEvent con codice KEYCODE_MEDIA_PLAY, che viene inviato al metodo onMediaButtonEvent del Callback. Se onPlay() è implementato nel Callback, il sistema lo chiama direttamente. Una singola pressione del pulsante della cuffia invia KEYCODE_MEDIA_PLAY_PAUSE — il lettore deve alternare lo stato.

Gestione di scenari complessi con più pulsanti

Le cuffie Bluetooth moderne possono avere fino a 5 pulsanti: volume +/-, play/pause, next, previous. Ogni pulsante genera il proprio KeyEvent, che deve essere gestito correttamente dal Callback. Una doppia pressione di play/pause viene tipicamente interpretata come passaggio al brano successivo (ACTION_SKIP_TO_NEXT) su molte cuffie.

Secondo il Documento di Definizione di Compatibilità Android (2026), tutte le app con contenuti multimediali devono gestire correttamente KEYCODE_MEDIA_PLAY_PAUSE. Ignorare questo requisito porta a una diminuzione automatica della valutazione dell'app in Google Play per la categoria Musica e Audio.

Sincronizzazione con il centro multimediale di sistema

A partire da Android 11, il centro multimediale di sistema (Pannello di Controllo Multimediale) mostra fino a 5 sessioni recenti di MediaSession nel pannello delle notifiche. L'utente può controllare il lettore senza aprire l'app. Per una visualizzazione corretta, è necessario implementare MediaBrowserService e popolare correttamente PlaybackState.

Il Pannello di Controllo Multimediale mostra: titolo del brano, artista, copertina (da MediaMetadata), pulsanti di controllo (dalle azioni disponibili di PlaybackState). Se l'app non aggiorna PlaybackState almeno una volta ogni 10 secondi durante la riproduzione attiva, il centro multimediale nasconde la sessione dal pannello.

Servizio in primo piano con notifica

kotlin
private fun startForegroundService() {
    val notification = NotificationCompat.Builder(this, "media_channel")
        .setSmallIcon(R.drawable.ic_play)
        .setContentTitle("In riproduzione")
        .setContentText(currentTrackTitle)
        .setPriority(NotificationCompat.PRIORITY_LOW)
        .setStyle(
            androidx.media.app.NotificationCompat.MediaStyle()
                .setMediaSession(mediaSession.sessionToken)
        )
        .build()
    startForeground(1001, notification)
}

La notifica MediaStyle si collega a MediaSession tramite il sessionToken e mostra i pulsanti multimediali standard. Senza MediaStyle, la notifica apparirà come un avviso normale senza pulsanti di controllo. Android 13+ richiede l'autorizzazione esplicita POST_NOTIFICATIONS per la visualizzazione.

Domande frequenti

Un'app può avere più MediaSession attive contemporaneamente?

Tecnicamente sì, ma in un dato momento solo una sessione è considerata attiva. Quando si crea una nuova sessione senza chiamare setActive(true), la precedente rimane attiva. Si consiglia di avere una sessione per app o una per sorgente audio indipendente con commutazione dello stato attivo.

Come interagisce MediaSession con Audio Focus?

MediaSession non gestisce Audio Focus automaticamente — questo è un meccanismo separato. Quando riceve un comando onPlay, lo sviluppatore deve richiedere AudioFocus tramite AudioManager in modo indipendente e, in caso di perdita del focus, mettere in pausa la riproduzione tramite la sessione.

Perché i pulsanti multimediali sulle cuffie non funzionano con la mia app?

Verificare che i flag FLAG_HANDLES_MEDIA_BUTTONS e FLAG_HANDLES_TRANSPORT_CONTROLS siano impostati. Assicurarsi anche che la sessione sia attiva (setActive(true)). Su Android 12+, i pulsanti multimediali funzionano solo tramite MediaSession — il vecchio registerMediaButtonEventReceiver non è supportato.

MediaBrowserService è necessario per il funzionamento di MediaSession?

Per la gestione di base dei pulsanti — no. Ma per l'integrazione con Android Auto, Wear OS e il centro multimediale di sistema, MediaBrowserService è necessario. Google raccomanda di implementare MediaBrowserService in tutte le app con riproduzione audio di lunga durata.

Come verificare che MediaSession sia configurato correttamente?

Utilizzare il comando adb shell dumpsys media_session per visualizzare le sessioni attive, i loro Callback e PlaybackState. Questa utility mostra tutte le sessioni registrate con il loro tag, stato di attività e ultimo stato noto — uno strumento comodo per il debug.

Riepilogo

  • MediaSession è il modo standard per gestire la riproduzione in Android, sostituendo RemoteControlClient a partire dall'API 21.
  • La sessione riceve comandi da Bluetooth, cuffie, Android Auto e dal centro multimediale di sistema tramite il sistema di Callback.
  • PlaybackState e MediaMetadata sono due componenti obbligatori per la corretta sincronizzazione con l'interfaccia di sistema.
  • L'integrazione viene effettuata tramite MediaSessionCompat da AndroidX media, che fornisce compatibilità con API 14+.
  • Per la visualizzazione nel centro multimediale di sistema sono necessari MediaBrowserService e un servizio in primo piano con notifica MediaStyle.
  • La gestione di Audio Focus è un'attività separata non automatizzata da MediaSession. Lo sviluppatore gestisce il focus in modo indipendente.
  • Per il debug, utilizzare adb shell dumpsys media_session per visualizzare le sessioni attive e il loro stato.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche