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

Android 10及以上外部存储文件写入功能失效问题求助(Android Studio/Kotlin)

问题原因

Android 10(API 级别 29)开始系统引入分区存储机制,默认禁止应用直接访问公共存储根目录,你原有代码中使用的Environment.getExternalStorageDirectory()方法已被官方废弃,即便用户授予了存储权限,也无法直接在公共存储根目录创建文件夹、写入文件,因此只有Android 9及更低版本可以正常运行。

解决方案

方案一:临时适配Android 10(过渡方案,Android 11及以上无效)

  1. 在AndroidManifest.xml的<application>节点添加属性,请求使用旧版存储逻辑:
<application
    ...
    android:requestLegacyExternalStorage="true">
    ...
</application>
  1. 确认manifest中已配置存储权限:
<!-- 存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="29" />

方案二:长期兼容全版本(推荐)

建议将文件存放到应用专属外部存储目录,该目录不需要申请任何存储权限,适配所有Android版本,修改WriteFile类中文件夹初始化逻辑即可:

// 替换原有folder初始化代码
// 直接在应用专属外部存储下创建WaterLedger文件夹
folder = File(context.getExternalFilesDir(null), "WaterLedger")
// 原判断逻辑冗余,直接判断文件夹不存在就创建
if (!folder.exists()) {
    // 改用mkdirs(),确保多级目录创建成功
    folder.mkdirs()
}

如果需要生成的文件对其他应用可见(比如让用户在系统文件管理器里能找到),可以优先存到公共的Documents目录,Android 10及以上用MediaStoreAPI写入即可。

原有代码其他优化点

  • 原代码中if(!folder.exists() || folder.exists())的判断逻辑完全无效,无论文件夹是否存在都会进入分支,可以直接删除冗余判断
  • AsyncTask已被官方废弃,建议替换为Kotlin协程、WorkManager等更稳定的异步处理方案
  • 创建文件夹时建议用mkdirs()代替mkdir(),避免父目录不存在时创建失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:09:04