You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何开启WebView文件下载?Android Studio中PDF下载配置方法

在Android WebView中开启文件下载(含PDF文档下载配置)

我来帮你解决这个问题,在Android WebView中开启文件下载,尤其是PDF文档的下载配置,其实分基础配置和针对PDF的特殊处理两步来做:

一、开启WebView的基础文件下载功能

WebView默认不会处理文件下载请求,所以我们需要手动设置下载监听器,借助系统下载管理器来完成下载流程:

  1. 设置DownloadListener拦截下载请求
    在初始化WebView的代码中添加以下逻辑,当WebView检测到下载请求时,会触发onDownloadStart方法,我们在这里调用系统下载管理器来处理:
webView.setDownloadListener(new DownloadListener() {
    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {
        // 自动解析文件名
        String fileName = URLUtil.guessFileName(url, contentDisposition, mimeType);
        
        // 构建下载请求
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setMimeType(mimeType);
        // 配置通知栏显示:下载过程和完成后都通知用户
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        request.setTitle(fileName);
        // 设置下载保存路径(适配不同Android版本)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            // Android 10+ 使用公共下载目录,无需额外权限
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);
        } else {
            // Android 9及以下,需要WRITE_EXTERNAL_STORAGE权限
            request.setDestinationUri(Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), fileName)));
        }
        // 带上请求头(部分网站验证User-Agent或Cookie才能下载)
        request.addRequestHeader("User-Agent", userAgent);
        // 如果需要携带Cookie,添加这行(比如登录后的下载链接)
        String cookie = CookieManager.getInstance().getCookie(url);
        if (cookie != null) {
            request.addRequestHeader("Cookie", cookie);
        }
        
        // 发起下载请求
        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        if (downloadManager != null) {
            downloadManager.enqueue(request);
            Toast.makeText(getApplicationContext(), "开始下载:" + fileName, Toast.LENGTH_SHORT).show();
        }
    }
});
  1. 配置必要权限
    在AndroidManifest.xml中添加基础权限:
<!-- 网络权限必须要有 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- Android 9及以下需要存储权限,还要在运行时动态申请 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

二、解决WebView无法下载PDF文档的问题

很多时候PDF无法触发下载,是因为网站将PDF内嵌在页面中(比如用<iframe>或PDF.js在线预览),这时候默认的下载监听器可能捕获不到请求,我们可以通过两种方式解决:

方法1:拦截PDF链接,强制触发下载

通过WebViewClient拦截所有URL,判断是否为PDF链接,手动触发下载逻辑:

webView.setWebViewClient(new WebViewClient() {
    // 适配Android 7+
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        // 判断是否为PDF链接(后缀或MIME类型)
        if (url.endsWith(".pdf") || 
            (request.getRequestHeaders().get("Accept") != null && request.getRequestHeaders().get("Accept").contains("application/pdf"))) {
            // 调用之前设置的下载监听器
            view.getDownloadListener().onDownloadStart(url, view.getSettings().getUserAgentString(), null, "application/pdf", 0);
            return true; // 拦截WebView的默认加载行为
        }
        return super.shouldOverrideUrlLoading(view, request);
    }

    // 适配Android 6及以下
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.endsWith(".pdf")) {
            view.getDownloadListener().onDownloadStart(url, view.getSettings().getUserAgentString(), null, "application/pdf", 0);
            return true;
        }
        return super.shouldOverrideUrlLoading(view, url);
    }
});

方法2:禁用WebView的内嵌PDF预览

部分设备的WebView会自动内嵌预览PDF,导致无法触发下载,我们可以通过配置WebSettings来禁用这个行为:

WebSettings webSettings = webView.getSettings();
// 开启JavaScript(很多网站的PDF链接是JS生成的)
webSettings.setJavaScriptEnabled(true);
// 禁用内置PDF查看器(Android 5+)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    webSettings.setAllowContentAccess(true);
    // 如果网站是HTTPS混合HTTP资源,需要允许混合内容加载
    webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}

额外注意事项

  • 如果下载的PDF需要登录权限,一定要记得在下载请求中带上Cookie,否则可能会返回403错误。
  • Android 11及以上推荐使用应用私有目录(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS))来保存下载文件,这种方式不需要申请存储权限,代码只需修改保存路径即可:
request.setDestinationInExternalFilesDir(getApplicationContext(), Environment.DIRECTORY_DOWNLOADS, fileName);

内容的提问来源于stack exchange,提问作者DEV186516844

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:11:21