publicvoidplay(){ // 在开始播放前,先申请AudioFocus,注意传入的参数 int result = mAudioManager.requestAudioFocus( mAudioFocusListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); // 只有成功申请到AudioFocus之后才能开始播放 if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) mMediaPlayer.start(); else // 申请失败,如果系统没有问题,这一定是正在通话过程中,所以,还是不要播放了 showMessageCannotStartPlaybackDuringACall(); } public void stop() { // 停止播放时,需要释放AudioFocus mAudioManager.abandonAudioFocus(mAudioFocusListener); }
private onAudioFocusChangeListenermAudioFocusListener = newOnAudioFocusChangeListener(){ // 当AudioFocus发生变化时,这个函数将会被调用。其中参数focusChange指示发生了什么变化 publicvoidonAudioFocusChange(int focusChange){ switch(focusChange) { // AudioFocus被长期夺走,需要中止播放,并释放AudioFocus // 这种情况对应于抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN case AUDIOFOCUS_LOSS: stop(); break; // AudioFocus被临时夺走,不久就会被归还,只需要暂停,AudioFocus被归还后再恢 复播放 // 这对应于抢走AudioFocus的申请者使用了AUDIOFOCUS_GAIN_TRANSIENT case AUDIOFOCUS_LOSS_TRANSIENT: saveCurrentPlayingState(); pause(); break; // AudioFocus被临时夺走,允许不暂停,所以降低音量 // 这对应于抢走AudioFocus的回放实例使用了AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK case AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: saveCurrentPlayingState(); setVolume(getVolume()/2); break; // AudioFocus被归还,这时需要恢复被夺走前的播放状态 case AUDIOFOCUS_GAIN: restorePlayingState(); break; } } };