Android应用中特定HTTP本地URL下载失败问题排查求助
排查思路:DownloadManager本地HTTP下载后getUriForDownloadedFile返回null
1. 先确认下载任务是否真的成功完成
广播仅通知下载任务结束,但不代表任务成功。先通过DownloadManager查询任务的实际状态:
val query = DownloadManager.Query().setFilterById(downloadID) val cursor = mgr.query(query) if (cursor.moveToFirst()) { val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) if (status != DownloadManager.STATUS_SUCCESSFUL) { val reasonCode = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)) println("下载失败,错误码:$reasonCode") // 错误码对应原因可参考DownloadManager的ERROR_*常量,比如ERROR_CANNOT_RESUME、ERROR_FILE_ERROR等 } } cursor.close()
如果状态不是STATUS_SUCCESSFUL,那uri为空是正常结果,优先解决下载失败的问题。
2. 检查Android的明文HTTP限制(API 28+)
Android 9及以上版本默认禁止明文HTTP请求,若你的应用targetSdkVersion >=28,本地HTTP请求会被系统拦截,直接导致下载失败:
- 临时解决方案:在
AndroidManifest.xml的<application>标签添加:android:usesCleartextTraffic="true" - 更安全的方案:创建
res/xml/network_security_config.xml,仅允许指定本地IP的明文请求:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">192.168.77.123</domain> </domain-config> </network-security-config>AndroidManifest.xml的<application>标签引用:android:networkSecurityConfig="@xml/network_security_config"
3. 检查本地HTTP服务器的响应头
部分本地服务器返回的响应头不符合DownloadManager的解析要求,导致文件无法正确保存:
- 用curl或浏览器开发者工具查看响应头:
curl -I http://192.168.77.123/FOLDER/Sample.mp3 - 重点对比公网HTTPS链接的响应头,检查
Content-Type(需为合法的音频类型,比如audio/mpeg)、Content-Disposition是否规范,缺失或错误的头信息可能导致DownloadManager无法识别并保存文件。
4. 验证本地网络的可用性
- 用设备自带浏览器访问本地HTTP链接,确认能正常下载文件,排除网络本身的问题(比如服务器未启动、防火墙拦截、IP/端口配置错误)。
- 检查设备和服务器是否在同一局域网,通过ping命令确认网络连通性。
5. 检查存储访问权限
虽然DownloadManager会将文件存在系统下载目录,但应用读取该文件需要READ_EXTERNAL_STORAGE权限:
- 若你的应用
targetSdkVersion >=23,需动态申请该权限; - 确认应用已获取该权限,否则后续
openInputStream也会抛出异常。
内容的提问来源于stack exchange,提问作者Michel
相关产品推荐
相关产品推荐

