Android WebView中HTTP流媒体无法播放问题咨询
问题根源与解决办法
嘿,这个问题我之前做WebView音频项目时也踩过坑!核心原因是**混合内容(Mixed Content)**的限制:你加载的是HTTPS协议的网站,但里面部分电台流媒体是HTTP明文协议的——从Android 5.0(API 21)开始,WebView默认会阻止非安全的HTTP资源在HTTPS页面里加载,以此保护用户安全,这就是为啥HTTPS的电台能正常播,HTTP的不行,而且因为是系统级的限制,Logcat里甚至不会弹出明确的报错提示。
具体解决方案
针对不同Android版本,我们需要调整WebView的混合内容策略,同时补充必要的配置:
1. 配置混合内容模式(API 21+)
直接给WebSettings设置混合内容模式,允许HTTPS页面加载HTTP媒体资源:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // 更安全的选项:兼容旧行为,允许加载非安全媒体资源,阻止非安全脚本 webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); // 如果需要完全允许所有HTTP资源(不推荐,安全性低): // webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); }
2. 补充必要配置
- 如果需要流媒体自动播放,要关闭用户手势要求:
webSettings.setMediaPlaybackRequiresUserGesture(false);
- 确保AndroidManifest.xml里已经添加网络权限:
<uses-permission android:name="android.permission.INTERNET" />
- 针对API 28及以上版本,需要在
<application>标签中开启明文流量支持:
<application ... android:usesCleartextTraffic="true">
修改后的完整Activity代码
WebView webView = findViewById(R.id.webview); webView.setWebViewClient(new WebViewClient()); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setAllowContentAccess(true); webSettings.setDomStorageEnabled(true); // 允许媒体自动播放(按需开启) webSettings.setMediaPlaybackRequiresUserGesture(false); // 处理混合内容限制 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); } webView.loadUrl("https://myurl.com");
内容的提问来源于stack exchange,提问作者İsa C.




