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

Android 11更新导致原有文件写入代码失效,报ENOENT错误如何解决

Android 11 写入外部存储文件报错解决方案

问题根因

Android 11(API 30)开始强制开启分区存储,普通应用不再拥有直接访问外部存储公共根目录的权限,你原有代码中使用的Environment.getExternalStorageDirectory()接口已被官方废弃,调用root.mkdirs()时会静默创建失败,后续写入文件时自然找不到对应路径,抛出ENOENT异常。
Android 10(API 29)版本中可通过在AndroidManifest.xml中添加android:requestLegacyExternalStorage="true"临时兼容,该配置在Android 11及以上版本已完全失效,这就是你之前版本运行正常、Android 11设备报错的核心原因。

修复方案

方案1:使用应用专属外部存储目录(优先推荐)

该目录为应用独有,不需要申请任何存储权限,写入逻辑改动最小,仅需替换原有的根目录初始化代码即可,目录内文件会随应用卸载同步删除,适合存储仅你的应用需要使用的业务数据:

// 需将context作为参数传入工具类,可从调用处的Activity/Service获取
File root = new File(context.getExternalFilesDir(null), FOLDER_NAME);

其余代码逻辑无需改动即可正常运行。

方案2:存储到公共目录(适用于需应用卸载后保留、或共享给其他应用的文件)

如果你的文件需要存到下载、文档等公共目录,需使用MediaStore API执行写入操作,不要直接通过File路径访问。
注:普通应用请勿申请MANAGE_EXTERNAL_STORAGE权限,该权限仅面向文件管理器、备份类等特殊用途应用,Google Play上架时会对该权限的使用场景做严格审核,不符合要求会被驳回。

额外优化建议

  • 原有代码未捕获root.mkdirs()的返回值,仅打了日志未做失败分支处理,建议添加创建失败的兜底逻辑,避免后续空路径报错
  • 可对存储权限添加版本适配,避免多余的权限申请,在AndroidManifest.xml中修改配置如下:
<!-- Android 9及以下才需要写外部存储权限 -->
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="28" />
<!-- Android 13及以下才需要读外部存储权限 -->
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:06:04