You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.

火山引擎 最新活动