Android WebView未加载混合内容

Android WebView未加载混合内容,android,webview,android-webview,Android,Webview,Android Webview,我正在尝试使用WebView制作一个应用程序,但该网站使用的是https,但内容(例如mp3文件)使用的是http,因此Android棒棒糖不会加载它,因为它是“混合内容”。我尝试使用onReceivedSslError处理程序。继续(),但它不加载任何内容。有办法解决吗?或者我可以让所有加载的网站都使用http,这样它就不会显示任何错误吗? 如果您的目标是API级别26或以上,则必须首先在清单文件中启用它。加 android:usesCleartextTraffic="true" 进入 若要

我正在尝试使用WebView制作一个应用程序,但该网站使用的是
https
,但内容(例如mp3文件)使用的是
http
,因此Android棒棒糖不会加载它,因为它是“混合内容”。我尝试使用
onReceivedSslError
处理程序。继续(),但它不加载任何内容。有办法解决吗?或者我可以让所有加载的网站都使用
http
,这样它就不会显示任何错误吗?

如果您的目标是API级别26或以上,则必须首先在清单文件中启用它。加

android:usesCleartextTraffic="true"
进入

若要更改此行为,当您以API级别21或更高为目标时,请使用:

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
在此模式下,WebView将尝试与 关于混合内容的现代web浏览器方法。一些 不安全的内容可能允许由安全的源和服务器加载 其他类型的内容将被阻止。内容的类型包括 “允许”或“阻止”可能会将版本更改为“版本”,但不会更改 明确定义

在实践中,这应该允许加载图像、视频、音乐等——当被恶意第三方篡改/替换时,所有可能成为主要安全威胁的内容


或者使用(强烈反对)

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
在此模式下,WebView将允许安全源加载内容 来自任何其他来源,即使该来源不安全。这是 WebView最不安全的操作模式,如果可能 应用程序不应设置此模式


如果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);
}

要在API>=21上有条件地加载它,您不必使用反射

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {   
          webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
}

我最近从Crosswalk迁移到使用本机WebView

我不得不和这个问题斗争几个小时。修复方法是在设置设置之前运行clearCache()

webView.clearCache(false);  // <-- DO THIS FIRST
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);

webView.clearCache(false);// 在android pie中,除了设置混合内容模式外,还需要在
AndroidManifest
中设置
android:usesCleartextTraffic
属性

在您的
AndroidManifest.xml
中,执行以下操作:

<application
    ....
    android:usesCleartextTraffic="true"
    ...>

转到manifest.xml并添加以下行

android:usesCleartextTraffic="true"
并在webview的Java文件中添加此代码

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);

如果遇到此问题,请确保已安装爱奥尼亚的WebView Cordova插件()。最简单的方法是检查package.json

一旦安装:

  • 打开config.xml文件

  • 检查是否有

  • 如果是,请检查值是否为“https”

  • 如果没有,请添加以下行:

  • 添加此行:


  • 这为我解决了问题。

    我遇到了同样的问题。我的目标设备是api19,上面的代码只在API21上工作,似乎处于最佳状态,它在任何情况下都不工作。有什么想法吗?我面临着同样的问题,这个解决方案似乎不起作用。有什么新的想法吗?这个答案不应该被接受。它似乎不起作用。嗯,对我来说,API 28不起作用。通过测试27、26、25,这些都可以正常工作。Android 9及更高版本需要在
    应用程序中使用AndroidManifest.xml的
    标记中的
    Android:usesCleartextTraffic=“true”
    属性,以及
    webView.getSettings().setMixedContentMode(WebSettings.MIXED\u CONTENT\u ALWAYS\u ALLOW)标志。这应该是正确的答案!非常感谢你。该属性
    android:usesCleartextTraffic
    AndroidManifest.xml
    文件中是必需的!即使默认值为true,我也需要将其显式设置为true。这段代码应该在哪里?如何访问webView?@syonip这取决于您创建webView的方式。如果您在活动中,则可以使用findViewById()方法获取引用。在将数据加载到代码块中之前,您可以将代码块放在任何位置(.e.onResume())似乎我说得太快了。这个解决方案奏效了。。。一次;在我重建应用程序后,它立即开始再次阻止我的http请求:(
    webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);