Android WebView无法加载混合内容

tae*_*euk 28 android webview android-webview

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

use*_*153 40

自Lollipop(API 21)以来,WebView默认阻止所有混合内容.

要更改此行为,当您定位API级别21或更高级别时,请使用:

android:usesCleartextTraffic="true"
Run Code Online (Sandbox Code Playgroud)

在此模式下,WebView将尝试与混合内容相关的现代Web浏览器方法兼容.可以允许一些不安全的内容由安全起源加载,并且将阻止其他类型的内容.允许或阻止的内容类型可能会将发布更改为发布,并且未明确定义.

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


或者使用(强烈劝阻):

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
Run Code Online (Sandbox Code Playgroud)

在此模式下,WebView将允许安全来源加载来自任何其他来源的内容,即使该来源不安全.这是WebView的最不安全的操作模式,并且可能的应用程序不应设置此模式.

  • 我遇到了同样的问题.我的目标设备是api19,上面的代码仅适用于api 21,似乎处于最佳状态,无论哪种方式都无法工作.有任何想法吗? (3认同)
  • 我面临同样的问题,这个解决方案似乎不起作用.有什么新想法吗? (3认同)
  • 这不应该被接受答案.它似乎不起作用. (3认同)
  • Android 9 及更高版本除了“webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);”标志之外,还需要 AndroidManifest.xml 的“application”标签中的“android:usesCleartextTraffic="true"”属性。 (3认同)

小智 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);
}
Run Code Online (Sandbox Code Playgroud)


Nav*_*ris 6

在android pie中,除了设置混合内容模式外,还需要在中设置android:usesCleartextTraffic属性AndroidManifest

在您的工作中AndroidManifest.xml

<application
    ....
    android:usesCleartextTraffic="true"
    ...>
Run Code Online (Sandbox Code Playgroud)

在设置网络视图时,请执行以下操作:

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
Run Code Online (Sandbox Code Playgroud)