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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:04