Android WebView 停止Audio音訊播放的方法
阿新 • • 發佈:2019-01-08
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管理了,所以在統一排程之下,我們就可以欺騙系統說我們要暫時借用一下音訊播放功能……
視訊就不能這麼做~~~