Android下载文件到Download目录所需权限及替代方案咨询
Android 存储权限适配问题解答
1. API≥29时WRITE_EXTERNAL_STORAGE的替代方案
不需要替换为其他权限。你是往公共Download目录的子目录写入文件,从API 29开始,访问这类公共媒体目录(Download、Pictures等)无需存储权限,直接通过MediaStore或者Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)结合文件API即可操作(API 30开始getExternalStoragePublicDirectory被标记为废弃,但仍可正常使用,也可改用MediaStore实现)。
如果是操作应用私有外部存储(getExternalFilesDir()),不管API版本,都不需要任何存储权限。
2. 是否需要为旧版本API保留WRITE_EXTERNAL_STORAGE?
需要保留,但可以通过maxSdkVersion限定作用范围。在API≤28的设备上,访问公共外部存储(包括Download目录)必须持有WRITE_EXTERNAL_STORAGE权限,且需要申请运行时权限。你可以在Manifest中这样声明:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />
添加maxSdkVersion="28"后,该权限仅对API≤28的设备生效,避免在高版本设备上被视为冗余权限。
3. 不同API版本的运行时权限行为差异
- API≤28:必须声明
WRITE_EXTERNAL_STORAGE(写权限隐含读权限),且必须在运行时申请该权限,用户授权后才能访问公共外部存储的非应用私有区域。 - API 29:若设置了
requestLegacyExternalStorage=true,会沿用旧存储模型,此时仍需WRITE_EXTERNAL_STORAGE权限才能访问公共存储;若未设置该flag,则启用分区存储模型,访问公共Download目录无需权限,可直接操作。 - API≥30:分区存储强制启用(
requestLegacyExternalStorage=true不再生效),访问公共媒体/文档目录(包括Download)无需存储权限,直接通过MediaStore或文件API操作;仅当需要访问其他应用的文件时,才需申请MANAGE_EXTERNAL_STORAGE特殊权限(该权限需用户跳转到系统设置开启,非文件管理器类应用不推荐使用)。
4. 测试现象的原因解释
- API≥30设备移除权限仍可下载:API30强制启用分区存储,访问公共Download目录不需要
WRITE_EXTERNAL_STORAGE权限,所以即使移除该权限或用户撤销授权,依然能正常写入文件。 - API≤29设备仍需权限弹窗:
- API≤28的设备本身就依赖
WRITE_EXTERNAL_STORAGE权限访问公共Download目录,因此必须申请运行时权限。 - API29设备因你设置了
requestLegacyExternalStorage=true,启用了旧存储模型,此时仍需WRITE_EXTERNAL_STORAGE权限才能访问公共存储,所以会弹出权限申请弹窗;若去掉该flag,API29设备也无需权限即可写入Download目录。
- API≤28的设备本身就依赖
内容的提问来源于stack exchange,提问作者Housefly
相关产品推荐
相关产品推荐

