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

Android Studio WebView下载文件显示为admin-ajax.php问题求助

问题原因
  • getFileType方法实现无效。你通过ContentResolver.getType(Uri.parse(url))获取动态接口的MIME类型时,由于下载地址是admin-ajax.php这类后端动态接口,而非指向静态文件的直链,该方法无法识别正确的文件后缀,返回null值。URLUtil.guessFileName接收空的后缀参数后,无法通过MIME补全文件名,会直接取URL路径的最后一段作为文件名,也就是admin-ajax.php。
  • DownloadManager未指定实际存储文件名。你仅调用了request.setTitle(fileName),该参数仅控制下载通知栏显示的标题,不会修改文件保存到本地存储的实际名称,DownloadManager默认会使用URL的最后一段作为存储文件名。
  • User-Agent请求头格式错误。代码中addRequestHeader("User - Agent", userAgent)的键名多了两处空格,正确的键名应为User-Agent,错误的请求头可能导致后端无法正常识别客户端请求,未返回携带原始文件名的Content-Disposition响应头,URLUtil.guessFileName无法从响应头中提取到正确的原始文件名。
  • 权限适配遗漏。Android 13(API 33)及以上版本已经废弃WRITE_EXTERNAL_STORAGE权限,你当前的权限申请逻辑在高版本系统中会直接申请失败,也可能间接导致下载逻辑异常。
  • 冗余错误代码导致逻辑异常。你在DownloadListener中定义的onPageStarted方法不属于DownloadListener的接口方法,属于冗余代码,且方法内部递归调用自身,会在触发时直接产生栈溢出崩溃,可能影响下载逻辑的正常执行,建议直接删除该段代码。
修复方案

1. 修正getFileType方法

直接从系统MimeTypeMap根据mimetype参数获取后缀,不需要调用ContentResolver:

public String getFileType(String mimeType) {
    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
    return mimeTypeMap.getExtensionFromMimeType(mimeType);
}

调用URLUtil.guessFileName时直接传入onDownloadStart回调提供的mimetype参数即可:

String fileName = URLUtil.guessFileName(url, contentDisposition, getFileType(mimetype));

2. 给DownloadManager.Request指定存储路径和文件名

在downloadFile方法的request配置中添加如下代码,指定文件保存到公共下载目录,使用你提取的正确文件名:

request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);

3. 修正User-Agent请求头

将请求头的键名修改为正确格式:

.addRequestHeader("User-Agent", userAgent)

4. 适配高版本存储权限

Android 13及以上版本不需要申请存储权限即可保存文件到公共下载目录,调整权限判断逻辑:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    downloadFile(fileName, url, userAgent);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        downloadFile(fileName, url, userAgent);
    } else {
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1001);
    }
} else {
    downloadFile(fileName, url, userAgent);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:48:00