android WebView是否支持<a> tags with download attribute? is there any workarround?

时间:2015-09-30 16:38:19

标签: android html5 android-webview android-download-manager

I'so I have an android app that loads a WebView containing tags like this

<a id="download-7630" href="/files/download/7630" download>someFilename.anyExtension</a>

In the context of the app's back end the files get served by a java controller connecting to mongoDB. I can't change the server code so I need a workaround for this. they are GET requests GET that return

ResponseEntity.ok()
            .header("Content-Disposition", "attachment; filename=someFilename.anyExtension")
            .contentLength(file.getLength())
            .contentType(MediaType.parseMediaType(file.getContentType()))
            .body(new InputStreamResource(file.getInputStream()));

The problem I'm having is that this download tags work perfectly on the browser and console says for example: "Resource interpreted as Document but transferred with MIME type application/pdf: " https://XYZDOMAIN/files/download/22306“。”但是当我从WebView中单击它们时,没有任何事件被激发。

我在 WebViewClient的shouldOverrideUrlLoading(), onLoadResource(), onPageStarted() and shouldInterceptRequest()我没有中有调试点,就像所形成的标签一样,点击或触摸事件被忽略了像这样,应用程序中的其他所有内容在WebView中都能正常运行。 (例如,在加载包含链接的网站时,或者在网站中的页面之间导航时,调试点工作正常)

我的webView设置包括:

WebSettings webSettings = mWebView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webSettings.setSaveFormData(true);
            webSettings.setSavePassword(true);
            webSettings.setDatabaseEnabled(true);
            webSettings.setDomStorageEnabled(true);
            webSettings.setSupportZoom(false);
            webSettings.setAllowFileAccess(true);
            webSettings.setAllowContentAccess(true);
MyWebViewClient myWebViewClient = new MyWebViewClient();
        mWebView.setWebViewClient(myWebViewClient);

MyWebViewClient只是一个扩展WebViewClient的类,我正在覆盖我正在尝试调试的方法

我正在尝试做的是管理服务器发回的文件以启动用户打开文件的意图,但我的问题是我甚至无法拦截任何东西甚至尝试做这一点。

我已经阅读了在AsyncTaks中处理下载或添加DownloadListeners等问题的解决方案,但我的问题是我无法拦截这些链接上的点击(html标签)。

任何可能错误或缺失的想法?

2 个答案:

答案 0 :(得分:2)

有些人过去报告过一个WebView漏洞,因此可能会有Android版本不支持下载属性宽度&#34; a&#34;标签。
但是,较新版本的WebView可以处理下载属性。

此帖子中的代码:Download File inside WebView完成了这项工作。

wv.setDownloadListener(new DownloadListener() {
    @Override
    public void onDownloadStart(String url, String userAgent,
                                    String contentDisposition, String mimetype,
                                    long contentLength) {
            DownloadManager.Request request = new DownloadManager.Request(
                    Uri.parse(url));

            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); //Notify client once download is completed!
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "Name of your downloadble file goes here, example: Mathematics II ");
            DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
            dm.enqueue(request);
            Toast.makeText(getApplicationContext(), "Downloading File", //To notify the Client that the file is being downloaded
                    Toast.LENGTH_LONG).show();

        }
    });

例如,点击<a href="example.com.file" download></a>不会触发WebViewClient :: onLoadResource。
我得到了理性,但似乎是一种非常不合理的行为......

答案 1 :(得分:0)

以下是浏览器上发生的情况:

  1. 用户点击链接(指向文件)
  2. 浏览器获取该网址/链接的HTTP标头,他们说“这是一个附件”
  3. 浏览器/下载管理器将其处理为要下载的smth,而不是重定向到
  4. Webview可能不知道如何处理下载,不知道如何使用此类Content-Type标头显示内容并且什么都不做。

    你能做的是:

    1. 在网页视图中拦截重定向(如果webview在理解不能显示任何内容时仍然会发生此事件)
    2. 您将获得一个网址
    3. 将其识别为指向文件的文件(例如,使用RegExp)
    4. 在webview外部处理文件下载
    5. 要拦截重定向网址,您需要:

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