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);
其實原理很簡單,Android 2.2之後將音頻播放統一在AudioManager管理了,所以在統一調度之下,我們就可以欺騙系統說我們要暫時借用一下音頻播放功能……
視頻就不能這麼做~~~