Android 10向公共下载目录下载文件报错的技术咨询
解决Android 10中DownloadManager保存到公共下载目录的问题
首先来看你遇到的错误根源:你调用setDestinationInExternalPublicDir时,错误地把完整拼接路径作为第一个参数传入了,但这个方法的第一个参数要求是系统定义的标准目录常量(比如Environment.DIRECTORY_DOWNLOADS),第二个参数才是该目录下的文件名或子路径。你的写法导致系统判定路径不属于标准公共目录,所以抛出了IllegalStateException。
修正后的代码
直接调整setDestinationInExternalPublicDir的参数即可,不需要自己手动拼接完整路径:
public void StartNewDownload(String url) { DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); request.setDescription("Downloading Profile"); request.setTitle("Abc App"); // 第一个参数传标准目录常量,第二个传目标文件名 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "parag.jpeg"); // 可选:让文件能被系统媒体扫描器识别,在系统「下载」应用中直接显示 request.allowScanningByMediaScanner(); DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); final long downloadId = manager.enqueue(request); }
Android 10及以上的额外说明
- 权限简化:在Android 10(API 29)及以上的分区存储机制下,使用
DownloadManager写入公共下载目录不需要申请WRITE_EXTERNAL_STORAGE权限,系统会自动授权给DownloadManager组件完成写入操作。 - 废弃方法的影响:虽然
Environment.getExternalStoragePublicDirectory()在Android Q中被标记为废弃,但DownloadManager.Request.setDestinationInExternalPublicDir()是完全兼容的,它内部已经适配了新的存储架构,不用担心兼容性问题。 - 文件可见性优化:加上
request.allowScanningByMediaScanner()可以让下载的文件被系统媒体扫描器及时发现,用户就能在系统自带的「下载」应用中直接看到这个文件,否则可能需要手动刷新文件管理器才能显示。
这样修改后,文件就会被正确保存到/storage/emulated/0/Download/parag.jpeg这个公共下载目录下了。
内容的提问来源于stack exchange,提问作者Parag Wadhwani
相关产品推荐
相关产品推荐

