Android 10及以上外部存储文件写入功能失效问题求助(Android Studio/Kotlin)
问题原因
Android 10(API 级别 29)开始系统引入分区存储机制,默认禁止应用直接访问公共存储根目录,你原有代码中使用的Environment.getExternalStorageDirectory()方法已被官方废弃,即便用户授予了存储权限,也无法直接在公共存储根目录创建文件夹、写入文件,因此只有Android 9及更低版本可以正常运行。
解决方案
方案一:临时适配Android 10(过渡方案,Android 11及以上无效)
- 在
AndroidManifest.xml的<application>节点添加属性,请求使用旧版存储逻辑:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
- 确认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
相关产品推荐
相关产品推荐

