MediaSession ist eine Android-Framework-Komponente zur Verwaltung der Medienwiedergabe und Integration mit externen Geräten. Sie bietet eine einheitliche Schnittstelle für die Interaktion mit Bluetooth-Headsets, Kopfhörern, Android Auto und der Systemmedienzentrale. Laut Android Developers Guide, 2026 ersetzt MediaSession den veralteten RemoteControlClient und ist für Player obligatorisch, die mit dem System synchronisieren.
Das Wichtigste
MediaSession ist eine Systemkomponente in Android, die es einer App ermöglicht, ihre Medienaktivität zu deklarieren und Steuerbefehle von externen Quellen zu empfangen. Wenn der Benutzer die Play-Taste an einem Bluetooth-Headset drückt, übergibt das System dieses Ereignis an die aktive MediaSession, und die App antwortet über ihren Callback.
Vor Android 5.0 wurde RemoteControlClient für diesen Zweck verwendet, aber er bot nicht genügend Flexibilität und unterstützte keine modernen Szenarien wie Android Auto, Smartwatches und Smart Speaker. MediaSession wurde in API 21 eingeführt und zum De-facto-Standard für alle Android-Apps mit Audio- und Videowiedergabe.
Laut Android-Entwicklerdokumentation (2026) sollte eine App eine MediaSession für jede unabhängige Wiedergabequelle erstellen. Zu jedem Zeitpunkt kann nur eine Sitzung aktiv sein — jede neue Sitzung deaktiviert automatisch die vorherige.
Die Kombination von MediaSession mit MediaBrowserService bietet einen vollständigen Medienverwaltungszyklus: Der Dienst stellt einen Inhaltsbaum (Playlists, Kataloge) bereit, und die Sitzung nimmt Navigations- und Wiedergabebefehle entgegen. Dies ist die von Google empfohlene Architektur für Musikplayer, Podcasts und Hörbücher.
MediaBrowserService läuft als Vordergrunddienst mit einer Benachrichtigung und stellt sicher, dass die App auch bei zerstörter Activity weiterarbeitet. Dies ist entscheidend für Audioplayer, die auch bei minimierter App weiterlaufen müssen.
Die Sitzung unterstützt zwei Arten der Interaktion: Sie empfängt Befehle von MediaController (der Client-Seite) und sendet den Status über PlaybackState. MediaController kann sich im selben Prozess oder in einer separaten App befinden — das System leitet Anfragen über SessionToken weiter.
Wenn der Benutzer den Android-Sprachassistenten aufruft und „Nächsten Titel abspielen“ sagt, findet das System die aktive MediaSession über die Verbindung zu MediaBrowserService und sendet den Befehl ACTION_SKIP_TO_NEXT. Der Callback der App empfängt den Aufruf onSkipToNext() und aktualisiert den PlaybackState.
Die Aktualisierung des PlaybackState über setPlaybackState() benachrichtigt sofort alle verbundenen MediaController-Instanzen. Die Systemmedienzentrale, das Bluetooth-Gerät und Android Auto erhalten das Update gleichzeitig — die Verzögerung beträgt unter normalen Bedingungen nicht mehr als 50 ms.
PlaybackState enthält wichtige Status-Flags: isPlaying, Position, Geschwindigkeit, verfügbare Aktionen (Play, Pause, Seek, Stop). Ohne einen korrekt gefüllten PlaybackState weiß das System nicht, welche Befehle die App unterstützt, und sendet keine entsprechenden Ereignisse.
Metadaten (MediaMetadata) ergänzen den Status um Informationen zum aktuellen Titel — Titel, Interpret, Albumcover-URI. Android Auto und Smartwatches verwenden MediaMetadata zur Anzeige von Informationen auf dem Bildschirm. Laut Google I/O 2024 erhöht die korrekte Befüllung von MediaMetadata die Sichtbarkeit der App in Drittanbieter-Startern um 40%.
Die MediaSession-Architektur besteht aus vier miteinander verbundenen Komponenten, die jeweils eine eigene Aufgabe erfüllen. Der Entwickler muss alle vier für eine vollständige Systemintegration implementieren.
Die Sitzung wird in der onCreate-Methode eines Dienstes oder einer Activity durch Aufruf von MediaSessionCompat(context, tag) erstellt. Nach der Erstellung muss setFlags(FLAG_HANDLES_MEDIA_BUTTONS | FLAG_HANDLES_TRANSPORT_CONTROLS) aufgerufen werden. In onDestroy wird release() aufgerufen, um Systemressourcen freizugeben.
Fehlerhaftes Lebenszyklusmanagement ist einer der häufigsten Fehler. Wenn release() nicht aufgerufen wird, bleibt die Sitzung im System bestehen, und die nächste App könnte einen veralteten Status erhalten. Android 13+ zeigt eine Logcat-Warnung bei Sitzungslecks an.
Die grundlegende Integration beginnt mit der Erstellung einer Sitzung und der Implementierung eines Callbacks. Es wird empfohlen, MediaSessionCompat aus der AndroidX Media-Bibliothek zu verwenden, die eine einheitliche API für alle Android-Versionen von API 14 bis 35 bietet.
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 diesem Beispiel wird eine MediaSession mit dem Tag MusicService und Flags für die Verarbeitung von Medientasten erstellt. Der Callback implementiert onPlay und onPause und aktualisiert den PlaybackState. Die Methode setActions deklariert verfügbare Aktionen, die das System auf dem Sperrbildschirm und in der Medienzentrale anzeigt.
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)
}
Metadaten sollten bei jedem Titelwechsel aktualisiert werden. Das System verwendet METADATA_KEY_TITLE und METADATA_KEY_ARTIST zur Anzeige von Informationen auf Bluetooth-Displays von Autos und Wearables. Wenn die Cover-URI nicht gesetzt ist, zeigt der Player einen grauen Platzhalter an.
Bluetooth-Headsets senden Befehle über das Profil AVRCP 1.6+. Android sendet diese Befehle als ACTION_MEDIA_BUTTON-Intents, die von MediaSession abgefangen werden, wenn das Flag FLAG_HANDLES_MEDIA_BUTTONS gesetzt ist.
Wenn der Benutzer die Play-Taste an Bluetooth-Kopfhörern drückt, erstellt das System ein KeyEvent mit dem Code KEYCODE_MEDIA_PLAY, das an die Methode onMediaButtonEvent des Callbacks gesendet wird. Wenn onPlay() im Callback implementiert ist, ruft das System es direkt auf. Ein einzelner Tastendruck am Headset sendet KEYCODE_MEDIA_PLAY_PAUSE — der Player sollte den Status umschalten.
Moderne Bluetooth-Kopfhörer können bis zu 5 Tasten haben: Lautstärke +/-, Play/Pause, Next, Previous. Jede Taste erzeugt ihr eigenes KeyEvent, das vom Callback korrekt verarbeitet werden muss. Ein Doppeldruck auf Play/Pause wird bei vielen Headsets typischerweise als Sprung zum nächsten Titel (ACTION_SKIP_TO_NEXT) interpretiert.
Laut Android Compatibility Definition Document (2026) müssen alle Apps mit Medieninhalten KEYCODE_MEDIA_PLAY_PAUSE korrekt verarbeiten. Die Missachtung dieser Anforderung führt zu einer automatischen Herabstufung der App-Bewertung im Google Play für die Kategorie Musik & Audio.
Ab Android 11 zeigt die Systemmedienzentrale (Media Control Panel) bis zu 5 aktuelle MediaSession-Instanzen in der Benachrichtigungsleiste an. Der Benutzer kann den Player steuern, ohne die App zu öffnen. Für die korrekte Anzeige müssen MediaBrowserService implementiert und PlaybackState korrekt befüllt werden.
Das Media Control Panel zeigt: Titel, Interpret, Cover (aus MediaMetadata), Steuertasten (aus den verfügbaren PlaybackState-Aktionen). Wenn die App PlaybackState während der aktiven Wiedergabe nicht mindestens einmal alle 10 Sekunden aktualisiert, blendet die Medienzentrale die Sitzung aus dem Panel aus.
private fun startForegroundService() {
val notification = NotificationCompat.Builder(this, "media_channel")
.setSmallIcon(R.drawable.ic_play)
.setContentTitle("Läuft jetzt")
.setContentText(currentTrackTitle)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setStyle(
androidx.media.app.NotificationCompat.MediaStyle()
.setMediaSession(mediaSession.sessionToken)
)
.build()
startForeground(1001, notification)
}
Die MediaStyle-Benachrichtigung verbindet sich über den sessionToken mit der MediaSession und zeigt standardmäßige Medientasten an. Ohne MediaStyle erscheint die Benachrichtigung als normale Warnung ohne Steuertasten. Android 13+ erfordert die explizite Berechtigung POST_NOTIFICATIONS für die Anzeige.
Häufig gestellte Fragen
Technisch ja, aber zu jedem Zeitpunkt wird nur eine Sitzung als aktiv betrachtet. Beim Erstellen einer neuen Sitzung ohne Aufruf von setActive(true) bleibt die vorherige aktiv. Es wird empfohlen, eine Sitzung pro App oder eine pro unabhängiger Audioquelle mit Umschaltung des aktiven Status zu haben.
MediaSession verwaltet Audio Focus nicht automatisch — dies ist ein separater Mechanismus. Beim Empfang eines onPlay-Befehls muss der Entwickler selbstständig AudioFocus über AudioManager anfordern und bei Fokusverlust die Wiedergabe über die Sitzung pausieren.
Überprüfen Sie, ob die Flags FLAG_HANDLES_MEDIA_BUTTONS und FLAG_HANDLES_TRANSPORT_CONTROLS gesetzt sind. Stellen Sie auch sicher, dass die Sitzung aktiv ist (setActive(true)). Unter Android 12+ funktionieren Medientasten nur über MediaSession — der alte registerMediaButtonEventReceiver wird nicht unterstützt.
Für die grundlegende Tastenverarbeitung — nein. Für die Integration mit Android Auto, Wear OS und der Systemmedienzentrale ist jedoch MediaBrowserService erforderlich. Google empfiehlt die Implementierung von MediaBrowserService in allen Apps mit langer Audiowiedergabe.
Verwenden Sie den Befehl adb shell dumpsys media_session, um aktive Sitzungen, deren Callbacks und PlaybackState anzuzeigen. Dieses Dienstprogramm zeigt alle registrierten Sitzungen mit ihrem Tag, Aktivitätsstatus und letztem bekannten Zustand — ein praktisches Werkzeug zum Debuggen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch