Android WebView中如何判断链接是下载文件还是网页?
Android WebView 区分文件链接与网页链接并处理
需求:在WebView中打开链接时,若链接指向MP4文件则触发下载,否则直接在WebView中加载该链接。现有已实现的下载监听及下载启动逻辑如下:
现有下载监听器代码
webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { DownloadFileManager.getInstance().startDownload(url, userAgent, contentDisposition, mimetype, contentLength); } });
现有下载启动函数
public void startDownload(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { if (PermissionHelper.isStoragePermissionGranted()) { String fileName = FileNameGenerator.getUniqueNameForDownloadedFile(url, contentDisposition, mimetype); long downloadManagerId = AndroidDownloadManagerHelper.downloadUrl(url, contentDisposition, mimetype, fileName); this.saveDownloadEntity(fileName, contentLength, downloadManagerId); this.runningDownloadItems.add(new DownloadItem(downloadManagerId)); this.startDownloadProgressJob(); } }
解决方案
可以通过MIME类型判断结合URL后缀兜底的方式,区分文件链接和网页链接,分别处理:
在DownloadListener中添加判断逻辑
利用onDownloadStart回调提供的mimetype参数,判断是否为需要下载的文件类型(比如MP4对应的video/mp4)。若mimetype为空,再通过URL后缀(如.mp4)做兜底判断:- 如果是目标文件类型,执行现有下载逻辑;
- 如果不是,调用WebView的
loadUrl方法加载该链接。
修改后的代码示例
修改下载监听器:webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) { // 定义需要下载的文件MIME类型集合 Set<String> downloadMimeTypes = new HashSet<>(Arrays.asList( "video/mp4", "video/mpeg", "video/quicktime" // 可按需扩展其他视频类型 )); boolean isNeedDownload = false; // 优先通过MIME类型判断 if (mimetype != null && downloadMimeTypes.contains(mimetype)) { isNeedDownload = true; } // MIME类型为空时,通过URL后缀兜底判断 else if (url != null && url.toLowerCase().endsWith(".mp4")) { isNeedDownload = true; } if (isNeedDownload) { // 执行原有下载逻辑 DownloadFileManager.getInstance().startDownload(url, userAgent, contentDisposition, mimetype, contentLength); } else { // 非文件链接,在WebView中加载 webView.loadUrl(url); } } });注意事项
- 若需要支持更多文件类型,只需在
downloadMimeTypes集合中添加对应的MIME类型,或补充URL后缀判断规则; - 确保WebView的
loadUrl调用在主线程执行(DownloadListener回调默认在主线程,一般无需额外处理); - 若URL存在重定向情况,可结合
WebViewClient的shouldOverrideUrlLoading方法提前拦截判断,避免DownloadListener误触发。
- 若需要支持更多文件类型,只需在
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

