我正在尝试使用WebView制作应用,但该网站正在使用https
,但内容(例如mp3文件)使用http
,因此Android Lollipop将不会加载它这是“混合内容”。我尝试使用onReceivedSslError
handler.proceed();
,但它没有加载任何内容。有办法解决吗?或者我可以只使用http
加载所有网站,所以它没有显示任何错误?
答案 0 :(得分:36)
Since Lollipop (API 21), WebView blocks all mixed content by default
要更改此行为,当您定位API级别21或更高级别时,请使用:
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
在此模式下,WebView将尝试与之兼容 关于混合内容的现代Web浏览器的方法。一些 可以允许安全来源加载不安全的内容 其他类型的内容将被阻止。内容的类型是 允许或阻止可能会将发布更改为发布而不是 明确定义。
在实践中,这应该允许加载图像,视频,音乐等 - 所有内容在被恶意第三方篡改/替换时成为主要安全威胁的可能性很小。
或者使用(强烈反对):
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
在此模式下,WebView将允许安全来源加载内容 来自任何其他来源,即使该起源不安全。这是 WebView的最不安全的操作模式,并在可能的情况下 应用程序不应设置此模式。
答案 1 :(得分:8)
如果您的min API小于21且无法直接调用setMixedContentMode,则可以使用反射:
try {
Method m = WebSettings.class.getMethod("setMixedContentMode", int.class);
if ( m == null ) {
Log.e("WebSettings", "Error getting setMixedContentMode method");
}
else {
m.invoke(webView.getSettings(), 2); // 2 = MIXED_CONTENT_COMPATIBILITY_MODE
Log.i("WebSettings", "Successfully set MIXED_CONTENT_COMPATIBILITY_MODE");
}
}
catch (Exception ex) {
Log.e("WebSettings", "Error calling setMixedContentMode: " + ex.getMessage(), ex);
}
答案 2 :(得分:5)
在android pie中,除了设置混合内容模式外,还需要在android:usesCleartextTraffic
中设置AndroidManifest
属性。
在您的AndroidManifest.xml
中执行
<application
....
android:usesCleartextTraffic="true"
...>
并在设置网络视图时执行:
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
答案 3 :(得分:3)
在API上有条件地加载&gt; = 21,您不必使用反射。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}
答案 4 :(得分:0)
我最近从Crosswalk迁移到使用本机WebView。
已经为这个问题奋战了几个小时。解决方法是在设置设置之前运行clearCache()。
之前
formatted = ' | '.join([str(pair) for pair in test[0]])
清除缓存
formatted = ' | '.join([str(pair)[1:-1] for pair in test[0]])
答案 5 :(得分:0)
转到manifest.xml并添加以下行。
android:usesCleartextTraffic="true"
然后在webview的Java文件中添加此代码。
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
答案 6 :(得分:0)
如果您遇到此问题,请确保您已安装 Ionic 的 WebView Cordova 插件 (https://github.com/ionic-team/cordova-plugin-ionic-webview)。最简单的方法是检查你的 package.json。
一旦安装:
打开你的 config.xml 文件
检查您是否有 <preference name="Scheme">
的条目
如果这样做,请检查值是否为“https”。
如果没有,请添加以下行:
<preference name="Scheme" value="https" />
添加这一行:
<preference name="MixedContentMode" value="0" />
这为我解决了问题。