Android 11使用DownloadManager下载文件至Download文件夹失效问题
问题原因分析
你日志输出的status=1对应DownloadManager.STATUS_PENDING,表示下载任务还在队列中等待执行,尚未启动。你在调用downloadManager.enqueue(request)将任务加入队列后立刻执行状态查询,此时任务还没开始下载,自然返回失败,也不会生成下载文件。
同时你当前设置的存储路径为应用专属沙箱目录:getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS),该路径下的文件不会出现在系统公共的Download文件夹中,需要到内部存储/Android/data/你的应用包名/files/Download目录下才能找到对应文件。
Android 11 除存储规则外的其他影响DownloadManager的变更
- 明HTTP流量限制:Android 9及以上版本默认禁止明HTTP请求,若你的下载url是http协议而非https,且没有在Manifest中配置
android:usesCleartextTraffic="true",下载请求会被系统直接拦截,任务一直处于pending状态或直接失败。 - 应用待机分组限制:Android 11强化了应用待机分组策略,如果你的应用被系统划分到受限分组,后台发起的下载任务会被延迟执行,只有当应用回到前台时才会继续下载。
- 下载管理器通知权限限制:你代码中设置了
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE),如果用户手动禁用了系统下载管理器的通知权限,Android 11上会导致需要展示通知的下载任务被卡住,无法正常执行。 - 重定向限制:DownloadManager默认最多支持5次重定向,如果你的下载链接重定向次数超过该阈值,任务会直接终止返回错误。
- 鉴权信息缺失:如果下载链接需要身份校验(如登录态Cookie、自定义请求头),你当前代码没有添加对应请求头,会导致服务器拒绝请求,下载任务无法正常执行。
代码修复建议
不要在任务入队后立刻查询下载状态,注册广播接收器监听DownloadManager.ACTION_DOWNLOAD_COMPLETE广播,收到广播后再根据下载ID查询任务状态,才是正确的处理逻辑。
如果你需要下载的文件展示在公共Download目录,Android 11及以上需要通过MediaStore API写入公共存储,或者申请MANAGE_EXTERNAL_STORAGE权限(仅适用于文件管理类应用)。
内容的提问来源于stack exchange,提问作者Marvin Stelter
相关产品推荐
相关产品推荐

