Android WebView 停止Audio音頻播放的方法

OK,各位,這是原創,轉載註明出處啊~~~~~


Android WebView停止視頻播放網上已經有資料了,大家可以google,我今天分了個工作,要停掉WebView裏面播放的音頻。不知道爲什麼這東西和停掉視頻完全不是一回事,網上那套都不管用的,結果哥一狠心,就去看源碼了。。。。


大家看HTML5Audio.java類:

play()


private void play() {
        if (mState == COMPLETE && mLoopEnabled == true) {
            // Play it again, Sam
            mMediaPlayer.start();
            mState = STARTED;
            return;
        }

        if (((mState >= ERROR && mState < PREPARED)) && mUrl != null) {
            resetMediaPlayer();
            setDataSource(mUrl);
            mAskToPlay = true;
        }

        if (mState >= PREPARED) {
            AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
            int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN);

            if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                mMediaPlayer.start();
                mState = STARTED;
            }
        }
    }

還有AudioManager的回調:

@Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
        case AudioManager.AUDIOFOCUS_GAIN:
            // resume playback
            if (mMediaPlayer == null) {
                resetMediaPlayer();
            } else if (mState != ERROR && !mMediaPlayer.isPlaying()) {
                mMediaPlayer.start();
                mState = STARTED;
            }
            break;

        case AudioManager.AUDIOFOCUS_LOSS:
            // Lost focus for an unbounded amount of time: stop playback.
            if (mState != ERROR && mMediaPlayer.isPlaying()) {
                mMediaPlayer.stop();
                mState = STOPPED;
            }
            break;

        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            // Lost focus for a short time, but we have to stop
            // playback.
            if (mState != ERROR && mMediaPlayer.isPlaying()) pause();
            break;
        }
    }


注意這兩段代碼:

AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
            int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
                AudioManager.AUDIOFOCUS_GAIN);

case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            // Lost focus for a short time, but we have to stop
            // playback.
            if (mState != ERROR && mMediaPlayer.isPlaying()) pause();

看到沒,人家赤裸裸的鼓勵我們去搶奪AudioManager的使用權啊,這豈能不去。。。。


//搶奪AudioManager控制權
		AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
		int i =0;
        do {
            int result = audioManager.requestAudioFocus(
                    new OnAudioFocusChangeListener() {
                        @Override
                        public void onAudioFocusChange(int focusChange) {
                            DebugLog.d(TAG, "onAudioFocusChange: "
                                    + focusChange);
                        }
                    }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

            if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
                DebugLog.d(TAG, "I get Audio right: ");
                break;
            }
            i++;
        } while (i < 10);


我們使用AudioManager.AUDIOFOCUS_GAIN_TRANSIENT去請求控制權,獲取到控制權的可能性還是很大的,因爲是暫時使用音頻播放嘛。


其實原理很簡單,Android 2.2之後將音頻播放統一在AudioManager管理了,所以在統一調度之下,我們就可以欺騙系統說我們要暫時借用一下音頻播放功能……

視頻就不能這麼做~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章