WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收
Posted
技术标签:
【中文标题】WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收【英文标题】:WebView does not render HTML/gzip content, which is received via HttpURLConnection in shouldInterceptRequest() webViewClient method 【发布时间】:2017-09-06 15:38:41 【问题描述】:Android 21+
我们有一个覆盖 shouldInterceptRequest 方法的 WebViewClient。在此方法中,我们手动发出 HTTP GET 请求,并将接收到的 InputStream 作为 WebResourceResponse 传递,完全期望 WebView 显示接收到的数据。接收到的内容是压缩后的 html。
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request)
HttpURLConnection urlc = null;
try
URL url = new URL(request.getUrl().toString());
urlc = (HttpURLConnection) network.openConnection(url); // network instance is received via some other way, unrelated to this problem
urlc.setRequestMethod("HEAD");
urlc.connect();
String contentType = urlc.getContentType();
String contentEncoding = urlc.getContentEncoding();
urlc.disconnect();
urlc = (HttpURLConnection) network.openConnection(url);
urlc.connect();
return new WebResourceResponse(contentType, contentEncoding, urlc.getInputStream());
catch (Exception e)
...
但是,WebView 只显示文本 - 它不显示正确的 HTML,它只显示原始内容,这是页面上显示的示例:
<html>
<head>SomeTitle</head>
<body>content....</body>
</html>
看起来它要么不理解提供的数据是 HTML,要么无法解析它(可能是因为 gzip?)。还是发生了其他事情?
通过 HEAD 调用接收到的内容类型和内容编码是:
HEAD REQUEST | CONTENT TYPE: text/html;charset=UTF-8 | ENCODING: gzip
并传递给WebResourceResponse,如上面的代码所示。
有什么想法吗..?
【问题讨论】:
【参考方案1】:似乎有必要从内容类型字符串中删除分号及其后面的所有内容。
int semicolon = contentType.indexOf(';');
if (semicolon >= 0)
contentType = contentType.substring(0, semicolon).trim();
【讨论】:
以上是关于WebView 不呈现 HTML/gzip 内容,该内容通过 shouldInterceptRequest() webViewClient 方法中的 HttpURLConnection 接收的主要内容,如果未能解决你的问题,请参考以下文章
即使由于在另一个选项卡中而不可见,如何使 JavaFX 的 webview 呈现?
HTML5 - 在 Android WebView 中首次加载时未呈现画布
在用户交互之前,Android WebView 无法完全呈现内容