Android SDK 22中DownloadManager创建目录失败问题求助
解决Android SDK 22中DownloadManager创建目录失败的问题
这个问题我之前适配低版本Android时也踩过一模一样的坑,SDK 22及以下的外部存储处理逻辑和高版本确实有不少差异,咱们一步步来搞定它:
问题根源拆解
虽然你已经拿到了WRITE_EXTERNAL_STORAGE权限,高版本模拟器也能正常运行,但SDK 22里DownloadManager的setDestinationInExternalPublicDir方法有两个容易踩的坑:
- 硬编码路径不兼容:直接写
/storage/sdcard/Download这种固定路径不可靠,不同设备的外部存储根目录可能不一样(比如很多设备是/storage/emulated/0/),硬编码会导致路径不存在。 - 自动创建目录的bug:官方文档说这个方法会自动创建目标目录,但SDK 22的实现有缺陷,没办法递归创建缺失的父目录。
具体修复方案
1. 用系统API获取标准Download目录
永远别硬编码外部存储路径,改用系统提供的API获取正确的公共下载目录:
val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
这个方法会根据设备的实际存储配置返回正确路径,兼容性拉满。
2. 手动创建目录(关键修复)
在设置DownloadManager请求前,手动检查并创建目录,确保父目录存在:
// 检查并递归创建下载目录 val downloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) if (!downloadDir.exists()) { downloadDir.mkdirs() } // 初始化DownloadManager请求 val request = DownloadManager.Request(Uri.parse("你的下载URL")) // 使用系统目录常量,而非硬编码路径 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "目标文件名.ext") // 可选配置:设置下载通知、允许媒体扫描等 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) request.allowScanningByMediaScanner() // 执行下载 val downloadManager = context.getSystemService(DOWNLOAD_SERVICE) as DownloadManager val downloadId = downloadManager.enqueue(request)
3. 确认Manifest权限声明
虽然你说权限检查返回true,但再核对下AndroidManifest.xml里有没有正确声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
SDK 22及以下不需要动态申请权限,但必须在Manifest里声明,否则权限检查可能出现误判。
额外提醒
如果你的应用还要适配SDK 23+,记得加上动态权限申请逻辑,但针对SDK 22的场景,以上步骤已经足够解决问题。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

