Android WebView无法加载混合内容

时间:2015-08-22 11:34:51

标签: android webview android-webview

我正在尝试使用WebView制作应用,但该网站正在使用https,但内容(例如mp3文件)使用http,因此Android Lollipop将不会加载它这是“混合内容”。我尝试使用onReceivedSslError handler.proceed();,但它没有加载任何内容。有办法解决吗?或者我可以只使用http加载所有网站,所以它没有显示任何错误?

7 个答案:

答案 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。

一旦安装:

  1. 打开你的 config.xml 文件

  2. 检查您是否有 <preference name="Scheme"> 的条目

  3. 如果这样做,请检查值是否为“https”。

  4. 如果没有,请添加以下行: <preference name="Scheme" value="https" />

  5. 添加这一行: <preference name="MixedContentMode" value="0" />

这为我解决了问题。