Android应用使用DownloadManager下载文件一直处于队列中无法完成
Android DownloadManager 下载卡在队列中修复方案
核心原因及对应修复方法
1. 未指定网络类型触发系统默认限制
多数系统版本的DownloadManager默认仅允许WiFi环境下下载,若设备使用移动数据则任务会长期停留在队列中。
修复代码:
// 允许WiFi和移动数据场景下载 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); // 允许在计费网络环境下下载 request.setAllowedOverMetered(true); // 根据需求配置是否允许漫游下载 request.setAllowedOverRoaming(false);
2. 未指定存储路径触发高版本系统分区存储限制
Android 10及以上版本执行分区存储规则,若未明确指定下载文件的存储路径,DownloadManager无法获得写入权限,会导致任务卡队列。
修复代码:
// 指定存储到公共下载目录,文件名为dummy.pdf,该路径无需申请额外存储权限 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "dummy.pdf");
3. 未设置资源MIME类型
部分系统的DownloadManager无法自动识别HTTPS链接的资源类型,会导致任务无法进入下载流程。
修复代码:
request.setMimeType("application/pdf");
4. 系统下载管理服务缓存异常
如果修改代码后问题仍存在,大概率是系统自带的DownloadManager服务队列拥堵或缓存异常,可按如下步骤修复:
- 进入系统设置-应用管理,找到「下载管理」(部分系统显示为Download Manager)
- 清空该应用的缓存与数据,重启设备后再测试下载
完整可运行代码示例
manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); Uri uri = Uri.parse("https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"); DownloadManager.Request request = new DownloadManager.Request(uri); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); // 新增修复配置 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE); request.setAllowedOverMetered(true); request.setMimeType("application/pdf"); request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "dummy.pdf"); long reference = manager.enqueue(request);
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

