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

32

我有一个文章应用程序,我在 WebView 中展示文章。 在Android 9.0(API-29)版本中,这个 WebView 不起作用。 应用程序在我的文章活动中什么也没有

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\">body{color: #525252;} img {max-width: 100%; height: auto}</style>"
   + "</head>"
   + item.getContent() //content of item
   + "";

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

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

3个回答

80

我的问题已经解决,问题出现在拥有最新Chrome的智能手机上。

解决方案:

不要使用

mWebview.loadData

方法,而是使用

mWebview.loadDataWithBaseURL

因此,我的解决方案是:

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


2
奇怪的是,loadData在调试版本中可以正常工作。但在发布版本中却无法工作。 - neobie
@neobie 你解决了发行版本的问题吗?在我的情况下,无论使用什么参数,loadDataloadDataWithBaseUrl 在发行版本中都不起作用,只有在调试版本中才有效。而且这也是特定项目的问题,因为从头开始创建的测试项目可以在发布构建中完美地显示webView中的本地内容。 - AlexanderShirshov
1
我将baseUrl(即最初获取html的url)包含在内,而不是保持为空。我的猜测是问题出在当webview尝试获取html中的图像时,它不知道该去哪里查找,但是在我提供原始url之后,它就知道该去哪里找到它们了。 - Trake Vital

38

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

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

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

这里是 javadoc 的详细说明。


1
救了我的命,兄弟! - Sumit
1
这应该是被接受的答案。谢谢您先生。 - MrPlow
1
太好了!这应该是被采纳的答案,当我从28升级到29时,我的网络视图停止工作了,你救了我的一天!非常感谢。 - dicarlomagnus

9
我也遇到了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();
    }

现在它像往常一样工作。

希望它能帮到你


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接