天天看點

Android擷取音頻焦點,播放自己的音頻

這些天在項目上遇到了些困難:在播放語音的時候遇到了第三方音頻播放器的幹擾。

倒騰了兩天,終于解決了,這裡mark一下。

在Android系統中,如果想自己的音頻播放不被第三方幹擾,例如有時出現音樂和你的語音一起播放,或者是一聲音大,一聲音小。

這時候必須先擷取音頻的焦點(除了一些耍流氓的),然後才去播放你的語音,而且在播放結束後必須釋放焦點。

1.請求音頻焦點

public void requestAudioFocus() {
        if (!mIsGetAudioFocus) {
            int result = mAudioManager.requestAudioFocus(afChangeListener,
                                                         AudioManager.STREAM_MUSIC, // Use the music stream.
                                                         AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
            if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                mIsGetAudioFocus = true;
            } else {
                Log.e(TAG, "AudioManager request Audio Focus result = " + result);
            }
        }
        
        Log.v(TAG, "requestAudioFocus mAudioFocus = " + mIsGetAudioFocus);
        
        // 根據需求,在使用者未選擇播放模式時,預設是聽筒
        if (isDefaultMode) {
            mAudioManager.setMode(AudioManager.MODE_IN_CALL);
            CommonUI.showToast(mContext, mContext.getResources().getString( R.string.chat_voice_note_earphone));
        }
    }
           

2.播放語音,在請求完焦點之後

Voice.getInstance(mContext).requestAudioFocus();
 mPlayer.start();
           

3.在你的語音播放結束之後,釋放焦點

mPlayer.setOnCompletionListener(new OnCompletionListener() {
                @Override
                public void onCompletion(MediaPlayer mp) {
                    Log.i(TAG, "Stop playback");
                    Voice.getInstance(mContext).abandonAudioFocus();
                }
            });