Search code examples
androidmedia-player

Interrupting MediaPlayer


My application makes a short announcement once in a while, either via TextToSpeech or using the MediaPlayer. If there is some other music running in the background probably by some application using the MediaPlayer, I would like to interrupt this music for a moment and after my announcement resume playing the "background music".

Is there a way to do it?


Solution

  • If you can target API level 8 and above (Android 2.2), then have a look into the AudioManager, specifically requestAudioFocus() with AUDIOFOCUS_GAIN_TRANSIENT and AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, and abandonAudioFocus().

    These give hints to the currently-playing music stream that your app would like to play a brief sound. If you use AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK with requestAudioFocus() you can get a nice effect where the already-playing music pauses, your sound plays, and then the playing music fades back in again when you call abandonAudioFocus().

    This works nicely with the built-in media players on the 2.2 devices I've tried it with (Samsung Galaxy S Wi-Fi and HTC Wildfire.) I've not tried it extensively with other music-playing apps, but it definitely works with Spotify, at least, and is the official way of doing exactly what you want to do.

    Note that you'll need to work out for yourself when to call abandonAudioFocus() as most sounds are played asynchronously. Luckily, both MediaPlayer and TextToSpeech provide callback mechanisms so they can give you a prod when they've finished playing your sound (this isn't true of SoundPool, so that's more annoying to use audio focus with.)