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?
If you can target API level 8 and above (Android 2.2), then have a look into the AudioManager, specifically
requestAudioFocus()withAUDIOFOCUS_GAIN_TRANSIENTandAUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, andabandonAudioFocus().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_DUCKwithrequestAudioFocus()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 callabandonAudioFocus().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, bothMediaPlayerandTextToSpeechprovide callback mechanisms so they can give you a prod when they’ve finished playing your sound (this isn’t true ofSoundPool, so that’s more annoying to use audio focus with.)