如何开启WebView文件下载?Android Studio中PDF下载配置方法
在Android WebView中开启文件下载(含PDF文档下载配置)
我来帮你解决这个问题,在Android WebView中开启文件下载,尤其是PDF文档的下载配置,其实分基础配置和针对PDF的特殊处理两步来做:
一、开启WebView的基础文件下载功能
WebView默认不会处理文件下载请求,所以我们需要手动设置下载监听器,借助系统下载管理器来完成下载流程:
- 设置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(); } } });
- 配置必要权限
在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
相关产品推荐
相关产品推荐

