You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录。

内容的提问来源于stack exchange,提问作者Housefly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:32:36