当手机原生app后来播放音频时,手机前台的app内有webview控件正在播放有声视频,此时就会出现两种声音同时播放(webview内的音频音量和手机是否静音无关)。此时可能需要暂停后台播放的音乐app,当前台的app播放完视频后,再恢复后台的音乐播放,但H5开发的小伙伴无法获取当前设备是否有后台音视频在播放。
解决:
原生书写js干预webview对音视频的播放。
<video controls="controls" src="http://www.w3school.com.cn/i/movie.ogg"></video>
<script type="text/javascript">
addEventListener = function (medias) {
for (var i = medias.length - 1; i >= 0; i--) {
var media = medias[i];
var volume = media.volume;
media.addEventListener('onplay',function(){if(volume>0){alert("不好,开工")};});
}
}
vedioListen = function(){
var videos = document.getElementsByTagName('video');
var audios = document.getElementsByTagName('audio');
addEventListener(videos);
addEventListener(audios);
}
vedioListen();
</script>
往webview内注入js
WKUserScript *mediaScript = [[WKUserScript alloc] initWithSource:addEventListenerForJsMedia injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:NO];
[webView.configuration.userContentController addUserScript:mediaScript];
最后,webview播放完成时( 可使用addEventListener 监听Media.ended属性变化,判断音视频是否播放完成。)恢复其他App Session的激活状态
- (BOOL)setActive:(BOOL)active
withOptions:(AVAudioSessionSetActiveOptions)options
error:(NSError * _Nullable *)outError;
这里的options传入AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation 即可
还可使用这种监听的思路达到控制当前webview内视频资源静默播放,当耳机插入时,设置webview播放的media资源的音量,耳机拔出是恢复静默播放。
耳机拔出通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(routeChange:) name:AVAudioSessionRouteChangeNotification object:nil];
网友评论