Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to turn off my media service for an incoming call? My AudioManager is not working

I'm trying to setup my audio playing app to stop playback if there is an interruption. I followed directions in Android SDK Developer notes about setting up an AudioFocusHelper like so:

public class AudioFocusHelper  implements AudioManager.OnAudioFocusChangeListener {
    AudioManager mAudioManager;  
    Media_Service mService;
    Context mContext;
    public AudioFocusHelper(Context ctx, Media_Service svc) {  
        mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);        
        mService = svc;    
        }    

    public boolean requestFocus() {        
        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==            
                mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,            
                        AudioManager.AUDIOFOCUS_GAIN);    
        }    

    public boolean abandonFocus() {        
        return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==            
                mAudioManager.abandonAudioFocus(this);    
        }    

    @Override    
    public void onAudioFocusChange(int focusChange) {        
        // let your service know about the focus change    
        mService.AudioFocus(focusChange);
    }
}

and I have my audio player running in a service as they suggest. I have this method in my audio service to respond to Audio Focus changes to pause the playback but its not working -- I don't know how to test this in the vm debugger so I can't really see what is happening on an incoming call. It doesn't appear to get called since I told it to popup toasts:

public void AudioFocus(int focusChange) {
    switch (focusChange) {        
    case AudioManager.AUDIOFOCUS_GAIN:            // resume playback           
        if (mMediaPlayer == null) 
            initMediaPlayer();            
        else if (!mMediaPlayer.isPlaying()) 
            mMediaPlayer.start();            
        //mMediaPlayer.setVolume(1.0f, 1.0f);            
        break;        
    case AudioManager.AUDIOFOCUS_LOSS:            // Lost focus for an unbounded amount of time: stop playback and release media player            
        if (mMediaPlayer.isPlaying()) {
            Toast.makeText(this,
                    "Playback interrupted by focus loss", Toast.LENGTH_SHORT).show();

            mMediaPlayer.stop();     
        }
        mMediaPlayer.release();            
        mMediaPlayer = null;            
        break;        
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:            // Lost focus for a short time, but we have to stop           
        // playback. We don't release the media player because playback            
        // is likely to resume            
        if (mMediaPlayer.isPlaying()) {
            Toast.makeText(this,
                    "Playback paused by focus loss (transient)", Toast.LENGTH_SHORT).show();
            mMediaPlayer.pause();      
        }
        break;        
    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:            // Lost focus for a short time, but it's ok to keep playing            
        // at an attenuated level            
        if (mMediaPlayer.isPlaying())  {
            Toast.makeText(this,
                    "Playback paused by focus loss (duck)", Toast.LENGTH_SHORT).show();
            mMediaPlayer.pause();            
            //mMediaPlayer.setVolume(0.1f, 0.1f); 
        }
        break;    
    }   
}

I can post more of the code if necessary, it seems like I'm posting a lot of code already and I don't want to post an excessive amount. It looks to me like my onAudioFocusChange just isn't getting called. I am running this on Android 2.2 (minSDK 8) since these feature is not supported before 2.2. Searched hi and low for tips and I find very little about this topic at all so I'm hoping somebody out there can give me some clues.

like image 667
user189581 Avatar asked Oct 25 '22 02:10

user189581


1 Answers

I had this same issue, remember you need to call the requestFocus() method when you start playback and abandonFocus() when you are done.

like image 50
Alan Moore Avatar answered Oct 27 '22 09:10

Alan Moore