我有一个特定的场景,我在身体中发出一个POST
请求,其中包含一个唯一的票证,以便返回结果页面。
结果页面为Content-Type
:application/pdf
或text/html
。
故障单仅有效一次,因此页面只能加载一次。
问题是Android WebView不支持渲染pdf(就像在iOS上一样)。
我尝试了以下内容:
使用主要请求检查http响应标头,然后使用第二个请求下载该文件(如果它是pdf并在PDF应用程序中打开它(正常))。但是对于加载html页面,第二个请求失败,因为票证不再有效。
下载pdf和html页面,然后在本地pdf app / WebView中打开。这样做,网页中的相对链接都被破坏了。还有一种很好的下载方式吗?
X。是否可以在WebView中断请求以读取响应标头并触发下载(如果它是pdf,否则只是继续渲染)?找不到合适的答案。
答案 0 :(得分:3)
您可以将内置方法 URLConnection.getContentType()用于确切的目的。一旦获得内容类型,就可以下载或传递到WebView
。
进口:
import java.net.URL;
import java.net.URLConnection;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
以下是在加载之前拦截URL的示例:
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
String requestedUrl = request.getUrl().toString();
boolean isDownloadableFile = false;
try {
isDownloadableFile = new FetchContentTypeAsync(requestedUrl).execute().get();
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
// downloadable file / dont load it in webview
if (isDownloadableFile) {
// download the file here
return false;
} else {
// non downloadable file / load it in webview
view.loadUrl(requestedUrl);
return super.shouldOverrideUrlLoading(view, request);
}
}
});
FetchContentTypeAsync 用于在后台运行任务
private static class FetchContentTypeAsync extends AsyncTask<Void, Void, Boolean> {
private String requestedUrl;
FetchContentTypeAsync(String requestedUrl) {
this.requestedUrl = requestedUrl;
}
@Override
protected Boolean doInBackground(Void... voids) {
boolean isDownloadableFile = false;
try {
URL url = new URL(requestedUrl);
URLConnection urlConnection = url.openConnection();
String contentType = urlConnection.getContentType();
isDownloadableFile = contentType.equalsIgnoreCase("application/pdf");
} catch (IOException e) {
e.printStackTrace();
}
return isDownloadableFile;
}
}
要下载文件检查 Download a file with Android, and showing the progress in a ProgressDialog
答案 1 :(得分:0)
设置WebViewClient之后,它有一些接口来截取最广泛使用的shouldOverrideUrlLoading()请求,但你也可以覆盖shouldInterceptRequest()并在那里拦截它。
webView.setWebViewClient(new WebViewClient() {
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) {
// Check the URL here - if it is a file,
// then initiate the download
return false;
}
}