【问题标题】:Android WebView not loading Mixed ContentAndroid WebView 不加载混合内容
【发布时间】:2015-11-16 07:15:41
【问题描述】:

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

【问题讨论】:

    标签: android webview android-webview


    【解决方案1】:

    如果您遇到此问题,请确保您已安装 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" />

    这解决了我的问题。

    【讨论】:

    • 看来我说得太快了。该解决方案有效……一次;在我重建应用程序后,它开始再次阻止我的 http 请求。 :(
    【解决方案2】:

    转到 manifest.xml 并添加以下行。

    android:usesCleartextTraffic="true"
    

    并在 webview 的 Java 文件中添加此代码。

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

    【讨论】:

      【解决方案3】:

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

      不得不与这个问题斗争了几个小时。解决方法是在设置设置之前运行 clearCache()。

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

      【讨论】:

        【解决方案4】:

        Since Pie (API 29), all non-HTTPS traffic in app is now disabled by default.

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

        android:usesCleartextTraffic="true"
        

        进入&lt;application&gt;标签。


        Since Lollipop (API 21), WebView blocks all mixed content by default.

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

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

        在这种模式下,WebView 将尝试与 现代网络浏览器关于混合内容的方法。一些 不安全的内容可能被允许由安全源加载,并且 其他类型的内容将被阻止。内容的类型是 允许或阻止可能会更改发布版本,而不是 明确定义。

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


        或者使用(强烈反对)

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

        在这种模式下,WebView 将允许安全源加载内容 来自任何其他来源,即使该来源不安全。这是 WebView 的最不安全操作模式,以及在可能的情况下 应用不应设置此模式。

        【讨论】:

        • 我遇到了同样的问题。我的目标是 api19 设备,上面的代码仅适用于 api 21,似乎处于最佳位置,它只是无法正常工作。有什么想法吗?
        • 我遇到了同样的问题,这个解决方案似乎不起作用。有什么新想法吗?
        • 这不应该被接受的答案。它似乎不起作用。
        • 嗯,对我来说不适用于 API 28。测试了 27、26、25,这些工作正常。
        • Android 9 及更高版本除了 webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); 标志外,还需要 AndroidManifest.xml 的 application 标记中的 android:usesCleartextTraffic="true" 属性。
        【解决方案5】:

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

        在你的AndroidManifest.xml 做:

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

        在设置 webview 时,请执行以下操作:

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

        【讨论】:

        • 这应该是正确的答案!太感谢了。 AndroidManifest.xml 文件中需要此属性android:usesCleartextTraffic
        • 即使默认值为 true,我也需要将其显式设置为 true
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 这段代码应该在哪里?你如何访问 webView?
          • @syonip 这取决于您如何创建 WebView。如果您在 Activity 中,则可以使用 findViewById() 方法获取参考。在将数据加载到其中之前,您可以将代码块放在任何地方(例如,您的 Activity 的 onResume())
          猜你喜欢
          • 1970-01-01
          • 2017-09-21
          • 1970-01-01
          • 2019-09-03
          • 2021-11-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多