Android WebView:在内容类型为application / pdf时下载,在没有时呈现网页

时间:2015-03-24 07:05:22

标签: android html pdf webview

我有一个特定的场景,我在身体中发出一个POST请求,其中包含一个唯一的票证,以便返回结果页面。

结果页面为Content-Typeapplication/pdftext/html。 故障单仅有效一次,因此页面只能加载一次。

问题是Android WebView不支持渲染pdf(就像在iOS上一样)。

我尝试了以下内容:

  1. 使用主要请求检查http响应标头,然后使用第二个请求下载该文件(如果它是pdf并在PDF应用程序中打开它(正常))。但是对于加载html页面,第二个请求失败,因为票证不再有效。

  2. 下载pdf和html页面,然后在本地pdf app / WebView中打开。这样做,网页中的相对链接都被破坏了。还有一种很好的下载方式吗?

  3. X。是否可以在WebView中断请求以读取响应标头并触发下载(如果它是pdf,否则只是继续渲染)?找不到合适的答案。

2 个答案:

答案 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;
        }
    }