MediaSessionCompat FLAG_IMMUTABLE/FLAG_MUTABLE: Komplette Kotlin-Lösung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Der „kaputte“ Player auf Android 12 und neuer

\n

Stellen Sie sich vor: Sie veröffentlichen stolz ein Update Ihrer Player- oder Podcast-App. Ein paar Tage später hagelt es in den Bewertungen wütende Kommentare: „Nach dem Update läuft keine Musik mehr!“, „Die Tasten auf dem Sperrbildschirm funktionieren nicht!“, „Die App stürzt ab, sobald ich einen Titel starte!“ Kommt Ihnen das bekannt vor? Dann sind Sie höchstwahrscheinlich auf den berüchtigten Fehler gestoßen, der Tausende von Entwicklern weltweit plagt:

\n
MediaSessionCompat: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent
\n

Dieses Problem ist eine der meistgestellten Fragen auf Stack Overflow (Zehntausende von Aufrufen) und steht in direktem Zusammenhang mit den Änderungen in Android 12 (API Level 31). Die gute Nachricht: Die Lösung ist einfach und dauert nicht länger als 10 Minuten. In diesem Artikel erklären wir die Ursachen des Fehlers, die richtige Lösung in Kotlin und die besten Praktiken, damit Ihre App wieder wie am Schnürchen läuft.

\n\n

Warum tritt der Fehler auf? PendingIntent verstehen

\n

Um das Problem zu verstehen, müssen wir uns ansehen, wie MediaSessionCompat funktioniert. Diese Komponente ermöglicht Ihrer App die Interaktion mit den systemeigenen Mediensteuerungen: Tasten am Headset, Sperrbildschirm, Benachrichtigungsleiste. Dazu erstellt sie einen PendingIntent – eine Art „aufgeschobenen Aufruf“ für Systemdienste. Das System verwendet diesen Intent, um Ihrer App mitzuteilen: „Der Benutzer hat Play/Pause/Next gedrückt.“

\n

Seit Android 12 (API 31) hat Google die Sicherheitsanforderungen für PendingIntent verschärft. Früher konnten Entwickler das Flag FLAG_IMMUTABLE oder FLAG_MUTABLE weglassen, und das System verwendete standardmäßig die veränderbare (mutable) Variante. Jetzt jedoch müssen Sie explizit angeben, ob das System den Inhalt Ihres Intents nach der Erstellung ändern darf. Tun Sie das nicht, stürzt Ihre App ab. Android 12+ erlaubt es einfach nicht, einen solchen PendingIntent zu erstellen.

\n\n

FLAG_IMMUTABLE vs FLAG_MUTABLE: Was wählen?

\n
    \n
  • FLAG_IMMUTABLE (empfohlen): Der Intent kann nach der Erstellung nicht mehr geändert werden. Das ist sicherer, da Angreifer keine Daten manipulieren können. Verwenden Sie dieses Flag in 90% der Fälle, auch für MediaSessionCompat.
  • \n
  • FLAG_MUTABLE: Der Intent kann geändert werden. Nur in besonderen Fällen nötig, z. B. bei NotificationCompat mit Aktionen, die dynamische Daten erfordern, oder bei der Arbeit mit AlarmManager.
  • \n
\n

Für MediaSessionCompat und Medienbenachrichtigungen verwenden Sie immer FLAG_IMMUTABLE. Das erhöht die Sicherheit und Stabilität Ihrer App.

\n\n

Schritt-für-Schritt-Lösung in Kotlin

\n

Schauen wir uns an, wie typischer Code aussieht, der den Fehler verursacht, und wie Sie ihn beheben. Meistens tritt das Problem in der onCreate()-Methode Ihres Dienstes oder MediaBrowsers auf.

\n\n

Falscher Code (führt zum Absturz auf Android 12+)

\n
// Alte Methode – ohne Angabe eines Flags\nval pendingIntent = PendingIntent.getActivity(\n    this,\n    0,\n    Intent(this, MainActivity::class.java),\n    0 // <-- Fehler! Kein FLAG_IMMUTABLE oder FLAG_MUTABLE\n)
\n\n

Richtiger Code in Kotlin (Lösung)

\n

Fügen Sie einfach PendingIntent.FLAG_IMMUTABLE als letzten Parameter hinzu:

\n
val pendingIntent = PendingIntent.getActivity(\n    this,\n    0,\n    Intent(this, MainActivity::class.java),\n    PendingIntent.FLAG_IMMUTABLE // <-- Lösung!\n)
\n

Wenn Ihre App auch ältere Android-Versionen (unter API 31) unterstützt, verwenden Sie eine bedingte Prüfung, um Abstürze auf älteren Geräten zu vermeiden:

\n
val flags = if (Build.VERS                

Blogs

Buchempfehlungen