Android WebView中无法通过外部浏览器下载Google Drive大文件
解决Android WebView中Google Drive大文件下载无响应的问题
你猜的没错!这个问题确实是Google Drive的病毒检查机制导致的——当文件较大(或下载量较高)时,Google会强制跳转到病毒扫描确认页面,而Android WebView默认不会自动处理这个跳转,也没有弹出让用户确认的交互,所以点击后看起来毫无反应。
下面是具体的解决思路和代码实现:
核心思路:拦截并修改跳转请求
Google Drive的病毒检查页面跳转后,我们可以拦截这个请求,自动构造带有确认参数的下载链接,绕开手动确认步骤。
Google Drive的确认下载链接格式为:https://drive.google.com/uc?export=download&id=FILE_ID&confirm=t
其中confirm=t就是触发直接下载的关键参数,FILE_ID是你要下载的文件在Drive中的唯一ID。
步骤1:拦截WebView的URL跳转
通过自定义WebViewClient,重写shouldOverrideUrlLoading方法,识别病毒检查页面并替换为确认下载链接:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); // 识别Google Drive的病毒检查跳转页面 if (url.contains("drive.google.com") && url.contains("/virus-scan")) { // 从URL中提取文件ID String fileId = extractFileIdFromUrl(url); if (fileId != null) { // 构造带确认参数的直接下载链接 String directDownloadUrl = "https://drive.google.com/uc?export=download&id=" + fileId + "&confirm=t"; view.loadUrl(directDownloadUrl); return true; // 表示我们已处理该请求 } } // 其他URL按默认逻辑处理 return super.shouldOverrideUrlLoading(view, request); } // 从URL参数中提取文件ID的工具方法 private String extractFileIdFromUrl(String url) { Uri uri = Uri.parse(url); return uri.getQueryParameter("id"); } });
步骤2:配置WebView的下载监听
确保WebView能正确触发下载流程,需要设置DownloadListener来调用系统下载管理器处理文件下载:
webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { // 使用系统下载管理器处理下载 DownloadManager.Request downloadRequest = new DownloadManager.Request(Uri.parse(url)); downloadRequest.setMimeType(mimetype); // 自动解析文件名 String fileName = URLUtil.guessFileName(url, contentDisposition, mimetype); downloadRequest.setTitle(fileName); downloadRequest.setDescription("正在下载文件..."); // 设置下载路径到公共下载目录 downloadRequest.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); // 发起下载请求 DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); if (downloadManager != null) { downloadManager.enqueue(downloadRequest); Toast.makeText(getApplicationContext(), "下载已启动", Toast.LENGTH_SHORT).show(); } } });
额外注意事项
- 权限配置:Android 6.0及以上版本需要动态申请
WRITE_EXTERNAL_STORAGE权限(如果下载到外部存储),同时在AndroidManifest.xml中声明权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> - WebView基础配置:确保开启必要的设置,比如JavaScript支持(如果你的HTML页面需要):
webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setAllowFileAccess(true);
内容的提问来源于stack exchange,提问作者Bir Nepali
相关产品推荐
相关产品推荐

