在WebView中下载文件


78

我的Android应用程序中有一个webview。当用户转到webview并单击链接以下载文件时,没有任何反应。

URL = "my url";
mWebView = (WebView) findViewById(R.id.webview);
mWebView.setWebViewClient(new HelloWebViewClient());
mWebView.getSettings().setDefaultZoom(ZoomDensity.FAR);
mWebView.loadUrl(URL);
Log.v("TheURL", URL);

如何在Webview中启用下载?如果我禁用了webview并启用了从应用程序在浏览器上加载URL的意图,那么下载将无缝进行。

String url = "my url";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);

有人可以帮我吗?该页面加载没有问题,但是HTML页面中指向图像文件的链接不起作用...


你可以使用这个Webview:子类处理等下载自动github.com/delight-im/Android-AdvancedWebView
CAW

Answers:


110

你有没有尝试过?

mWebView.setDownloadListener(new DownloadListener() {
    public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setData(Uri.parse(url));
        startActivity(i);
    }
});

示例链接:Webview文件下载-感谢@ c49


此代码有效,但是如果在WebView中对用户进行了身份验证,则在Android浏览器启动后要求他们再次登录,然后进行下载。我试图找到一种避免这种情况的方法,因此下载时无需他们再次登录。
CloudMeta 2012年


@ioSamurai您是否找到了一种下载文件的方式,该方式需要用户验证。 webView.setDownloadListener()不需要用户验证时,可以完美地工作。但是,当我从Google驱动器或其他需要用户身份验证的来源下载文件时,会下载文件,但没有数据。@ user370305您也可以提供帮助。
Sp4Rx

您可以选中Chrome自定义标签,以解决大多数问题。@Rohit
Sp4Rx


54

试试看 经过很多帖子和论坛之后,我发现了这一点。

mWebView.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();

        }
    });

不要忘记给予此许可!这个非常重要!将此添加到清单文件中(AndroidManifest.xml文件)

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />        <!-- for your file, say a pdf to work -->

希望这可以帮助。干杯:)


11
感谢使用!使用原始文件名,我们可以使用:final String filename= URLUtil.guessFileName(url, contentDisposition, mimetype);
Jawaad

9
@SaiZ您的示例包含一些有关未使用意图的代码,我想您应该删除它。
jc 2015年

@jc我删除了未使用的代码,感谢您报告它;)
MatPag

2
这是一个完美的答案,它将直接从webview启动下载,这实际上是预期的...谢谢
Ghanshyam Bagul

@Jawaad能否请您解释一下我应该将本机android代码放在哪里?我使用Xamarin.forms编译为本机,但我通常不敢接触本机代码,但这是必须的。TYIA。
s3c

18
    mwebView.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.setMimeType(mimeType);


    String cookies = CookieManager.getInstance().getCookie(url);


    request.addRequestHeader("cookie", cookies);


    request.addRequestHeader("User-Agent", userAgent);


    request.setDescription("Downloading file...");


    request.setTitle(URLUtil.guessFileName(url, contentDisposition,
            mimeType));


    request.allowScanningByMediaScanner();


    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setDestinationInExternalPublicDir(
            Environment.DIRECTORY_DOWNLOADS, URLUtil.guessFileName(
                    url, contentDisposition, mimeType));
    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
    dm.enqueue(request);
    Toast.makeText(getApplicationContext(), "Downloading File",
            Toast.LENGTH_LONG).show();
}});

请解释一下你写的。仅仅代码是不够的
Saveen 2016年

设置cookie保存了我的一天!谢谢!
francisco_ssb

这应该是可以接受的答案。谢谢你的朋友
Surya Reddy

我正在使用Web视图从Digi-locker下载文档,但是使用相同的代码片段下载却失败。文件格式为pdf。谁能帮我吗。
Ashish Patel

15

尝试使用下载管理器,它可以帮助您下​​载所需的所有内容并节省时间。

选中这些选项:

选项1->

 mWebView.setDownloadListener(new DownloadListener() {
        public void onDownloadStart(String url, String userAgent,
                String contentDisposition, String mimetype,
                long contentLength) {
 Request request = new Request(
                            Uri.parse(url));
                    request.allowScanningByMediaScanner();
                    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
                    DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                    dm.enqueue(request);        

        }
    });

选项2->

if(mWebview.getUrl().contains(".mp3") {
 Request request = new Request(
                        Uri.parse(url));
                request.allowScanningByMediaScanner();
                request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "download"); 
// You can change the name of the downloads, by changing "download" to everything you want, such as the mWebview title...
                DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
                dm.enqueue(request);        

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.