Audio-Wiedergabe in Android
Audio-Wiedergabe verlangt korrekten Umgang mit Audio Focus und App-Lebenszyklus. Du lernst, wie MediaPlayer und ExoPlayer richtig eingesetzt werden.
Audio-Wiedergabe gehört zu den häufigsten Funktionen in Android-Apps – von Musik-Playern über Podcasts bis hin zu Benachrichtigungstönen. Damit eine App korrekt mit dem System und anderen Apps zusammenspielt, reicht es nicht, einfach eine Audiodatei abzuspielen. Du musst den Audio Focus verwalten, auf Lifecycle-Ereignisse reagieren und Ressourcen sauber freigeben.
Was ist das?
Audio-Wiedergabe in Android bezeichnet die Fähigkeit einer App, Tondateien über die Lautsprecher oder angeschlossene Ausgabegeräte abzuspielen. Das klingt trivial, aber Android teilt den Audio-Output zwischen mehreren Apps auf: Musik-Apps, Navigations-Apps und System-Töne können gleichzeitig aktiv sein. Um Chaos zu vermeiden, regelt das Audio-Focus-System, welche App zu einem gegebenen Zeitpunkt Ton ausgeben darf.
Im Android-Kontext stehen dir zwei Hauptwerkzeuge zur Verfügung:
- MediaPlayer – die eingebaute Lösung aus dem Android-Framework, ausreichend für kurze Clips und lokale Dateien.
- ExoPlayer (heute Teil von Media3) – die von Google empfohlene Bibliothek für komplexe Szenarien wie Streaming, HLS, DASH, adaptive Bitrate oder Hintergrundwiedergabe in einem
Service.
Beide müssen korrekt mit dem Lebenszyklus verknüpft werden, um Speicherlecks und Fehler bei App-Unterbrechungen zu vermeiden.
Wie funktioniert es?
Audio Focus
Bevor eine App Ton abspielt, sollte sie beim System Audio Focus anfordern. Das System entscheidet dann, ob der Fokus gewährt wird oder ob eine andere App ihn gerade hält. Es gibt drei wichtige Fokus-Typen:
AUDIOFOCUS_GAIN– dauerhafter Fokus (z. B. Musik-Wiedergabe)AUDIOFOCUS_GAIN_TRANSIENT– kurzzeitiger Fokus (z. B. Sprachansage)AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK– kurzzeitiger Fokus, andere Apps dürfen leiser weiterspielen
Du implementierst einen AudioFocusChangeListener, der auf Änderungen reagiert. Wenn ein Anruf eingeht, verlierst du den Fokus (AUDIOFOCUS_LOSS) und musst die Wiedergabe pausieren. Wenn du den Fokus zurückbekommst (AUDIOFOCUS_GAIN), kannst du fortfahren.
Lifecycle-Integration
MediaPlayer durchläuft eigene Zustände (Initialized → Prepared → Started → Paused → Stopped). Du musst sicherstellen, dass:
release()spätestens inonStop()oder beim Zerstören der Activity aufgerufen wird.- Der Player bei einer Bildschirmrotation nicht neu erstellt wird – halte ihn in einem
ViewModeloderService. - Bei Hintergrundwiedergabe ein Foreground-Service (ab Android 8+ Pflicht) verwendet wird, damit das System die App nicht abbricht.
BECOMING_NOISY
Wenn der Nutzer Kopfhörer abzieht, sendet Android den Broadcast ACTION_AUDIO_BECOMING_NOISY. Ohne Reaktion darauf läuft die Wiedergabe plötzlich über den Lautsprecher weiter. Registriere einen BroadcastReceiver für diesen Intent und pausiere sofort.
In der Praxis
Hier ein minimales Beispiel, das Audio Focus korrekt anfordert und auf Fokus-Verlust reagiert:
class AudioPlayerManager(private val context: Context) {
private var mediaPlayer: MediaPlayer? = null
private val audioManager =
context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
private val focusRequest =
AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setOnAudioFocusChangeListener { focusChange ->
when (focusChange) {
AudioManager.AUDIOFOCUS_LOSS -> stopPlayback()
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> pausePlayback()
AudioManager.AUDIOFOCUS_GAIN -> resumePlayback()
}
}
.build()
fun startPlayback(resId: Int) {
val result = audioManager.requestAudioFocus(focusRequest)
if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) return
mediaPlayer = MediaPlayer.create(context, resId).apply {
setOnCompletionListener { stopPlayback() }
start()
}
}
private fun pausePlayback() { mediaPlayer?.pause() }
private fun resumePlayback() { mediaPlayer?.start() }
private fun stopPlayback() {
mediaPlayer?.stop()
mediaPlayer?.release()
mediaPlayer = null
audioManager.abandonAudioFocusRequest(focusRequest)
}
}
Typische Stolperfalle: Viele Entwickler vergessen abandonAudioFocusRequest(), wenn die Wiedergabe endet oder die App geschlossen wird. Der Audio Focus bleibt dann dauerhaft besetzt und blockiert andere Apps – ein klassischer Bug, der erst auffällt, wenn man eine Musik-App im Hintergrund laufen lässt und sie plötzlich stumm schaltet.
Für echte Hintergrundwiedergabe lohnt sich der Wechsel auf Media3 ExoPlayer mit einem MediaSessionService. Media3 übernimmt dabei große Teile der Focus-Verwaltung automatisch und liefert die Integration mit dem System-Medien-Player auf dem Sperrbildschirm gratis dazu.
Fazit
Saubere Audio-Wiedergabe in Android ist mehr als MediaPlayer.start() aufzurufen. Du musst Audio Focus anfordern und freigeben, auf Lifecycle-Ereignisse reagieren und den BECOMING_NOISY-Broadcast behandeln. Überprüfe deine Implementierung, indem du während der Wiedergabe einen Anruf simulierst, Kopfhörer abziehst und die App per Multitasking in den Hintergrund schickst. Schreibe dazu einen Instrumentierungstest, der sicherstellt, dass release() nach Abschluss der Wiedergabe aufgerufen wird – so deckst du Lecks früh auf und kannst sicher sein, dass deine App sich im echten Gerätebetrieb korrekt verhält.