如何禁用WebView中的Audiofocus功能实现多应用同时播放音频?
Android平台实现方案
WebView默认会继承App的音频焦点规则,要实现和其他音乐类App同时播放音频,可通过以下两种方案实现:
- 方案1:修改全局音频焦点策略
不要在App内主动调用requestAudioFocus方法抢占音频焦点,同时给WebView配置媒体播放属性:
如果需要完全不影响其他App的音频播放,直接删除所有// 安卓9及以上,关闭WebView媒体播放的用户手势限制(可选,根据需求配置) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { webView.getSettings().setMediaPlaybackRequiresUserGesture(false); } // 配置音频管理器,即使申请焦点也允许其他App继续播放,仅降低其他App音量 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); audioManager.requestAudioFocus( null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK );requestAudioFocus调用即可,WebView内部播放不会主动申请焦点。 - 方案2:反射拦截WebView的音频焦点申请
针对原生WebView,可通过反射禁止其内部MediaPlayer申请音频焦点:try { Field focusField = MediaPlayer.class.getDeclaredField("mAudioFocusRequested"); focusField.setAccessible(true); // 强制设置为未申请焦点状态 focusField.setBoolean(mediaPlayerInstance, false); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); }
iOS平台实现方案
iOS端通过修改AVAudioSession的配置即可实现,无需修改WebView本身逻辑:
- 在App启动或WebView初始化前配置音频会话属性:
do { // 设置音频类别为播放,同时允许和其他App音频混合 try AVAudioSession.sharedInstance().setCategory(.playback, options: .mixWithOthers) try AVAudioSession.sharedInstance().setActive(true) } catch { print("音频会话配置失败: \(error.localizedDescription)") }
注意事项
- 上述配置不会影响WebView内视频的正常播放,仅修改音频焦点的抢占逻辑
- 部分定制安卓ROM可能会强制系统级音频焦点规则,该场景下需要单独做适配
- 若需要WebView的音频在后台也能正常播放,需要额外申请对应平台的后台播放权限
- 上架应用商店前请确认平台规则,部分应用市场可能对禁用音频焦点的行为有审核限制
内容的提问来源于stack exchange,提问作者K.Naoto
相关产品推荐
相关产品推荐

