WebView.loadData 在 Android 9.0 (API-29) 上不起作用

Posted

技术标签:

【中文标题】WebView.loadData 在 Android 9.0 (API-29) 上不起作用【英文标题】:WebView.loadData not working on Android 9.0 (API-29) 【发布时间】:2019-06-28 05:34:38 【问题描述】:

我有一个文章应用程序,我在 WebView 中显示文章。在 android 版本 9.0 (API-29) 中,此 WebView 不起作用。该应用在我的文章 Activity 中显示 NOTHING

mWebView.setVisibility(View.VISIBLE);
mWebView.getSettings().setjavascriptEnabled(true);
mWebView.getSettings().setLoadWithOverviewMode(true);
mWebView.getSettings().setUseWideViewPort(true);
mWebView.getSettings().setMinimumFontSize(14);

String htmlContent = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"
   + "<head>"
   + "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"
   + "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"/>"
   + "<style type=\"text/css\">bodycolor: #525252; img max-width: 100%; height: auto</style>"
   + "</head>"
   + item.getContent() //content of item
   + "";

mWebView.loadData(htmlContent, "text/html; charset=utf-8", "UTF-8");

因此,我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

我解决了我的问题,问题出现在具有最新 Chrome 的智能手机中。

解决方案:

不要使用

mWebview.loadData

方法,而不是使用

mWebview.loadDataWithBaseURL

因此我的解决方案是:

mWebview.loadDataWithBaseURL(null,htmlContent,"text/html", "utf-8", null);

【讨论】:

奇怪的是,loadData 正在使用调试版本。它只会停止在发布版本上工作。 @neobie 你有没有机会解决发布版本的问题?在我的情况下,loadDataloadDataWithBaseUrl 在发布版本中都不能使用任何参数,只能在调试版本中使用。而且它也特定于项目,因为从头开始创建的测试项目在发布版本中使用 webView 显示本地内容非常好。 我包含了 baseUrl(我最初从中获取 html 的 url),而不是保持它为空。我的猜测是问题在于,每当 webview 试图获取 html 的图像时,他就不知道去哪里看,但是在我给它原始 url 之后,它就知道在哪里可以找到它们 天哪,我爱你。我以为我是个笨蛋,想知道 webview Visibility 是否不起作用,因为我只是看到一个白屏。然后这实际上是罪魁祸首,因为我正在使用 loadData 并且这适用于我的旧设备。 太棒了,你拯救了我的一天,兄弟【参考方案2】:

您的 HTML 内容应该是 Base64 或 URL 编码的。您的 HTML 示例中有一个“#”,这会导致某些 WebView 版本出现问题。

这是一个使用 Base64 编码的示例。

String htmlContent = "...";
String encodedHtml = Base64.encodeToString(htmlContent.getBytes(), Base64.NO_PADDING);
webView.loadData(encodedHtml, "text/html", "base64");

这里是javadoc了解详情。

【讨论】:

救了我的命,兄弟! 这应该是公认的答案。谢谢先生。 太棒了!这应该是公认的答案,当我从 28 升级到 29 时,我的 web 视图停止工作,你拯救了我的一天!非常感谢【参考方案3】:

Android 9.0 版我也有同样的问题

此页面上的文档 (https://developer.android.com/about/versions/pie/android-9.0-migration) 提到:

在 Android 9 中,Java 语言的 UTF-8 解码器更加严格,并且 遵循 Unicode 标准。

所以我尝试将 UTF-8 转换为 Base64 并使用 loadData()

try 
       String base64 = null;
       base64 = android.util.Base64.encodeToString(lecureHtmlData.getBytes("UTF-8"),
                    android.util.Base64.DEFAULT);
       wvLecture.loadData(base64, "text/html; charset=utf-8", "base64");
     catch (UnsupportedEncodingException e) 
            e.printStackTrace();
    

现在一切正常。

希望对你有帮助

【讨论】:

以上是关于WebView.loadData 在 Android 9.0 (API-29) 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android 应用程序中的编码问题 (WebView.LoadData())

android中的webview loaddata不会从img src加载图片

必须两次加载数据才能在 Android 中刷新 WebView

WebView 为空,直到我触摸组件

Android webview不显示'%'字符

Android - webview 中的本地图像