如何在Android 10上不使用SAF将文件保存至二级外部存储卷?
解决Android 10(SDK 29)二级外部存储根目录写入权限问题
问题原因
android:requestLegacyExternalStorage="true" 仅对主外部存储生效,在Android 10(SDK 29)中,即使开启该标志,WRITE_EXTERNAL_STORAGE 权限也无法授予对二级外部存储(如SD卡)根目录的写入权限。此外,MANAGE_EXTERNAL_STORAGE 权限是Android 11(SDK 30)才引入的,在Android 10上完全无效。
无需SAF的解决方法
方法1:将targetSdkVersion降至28
当应用的 targetSdkVersion 设置为28或更低时,Android 10会自动采用传统存储模型,此时 WRITE_EXTERNAL_STORAGE 权限将覆盖所有外部存储(包括二级存储)的根目录写入权限。
修改 build.gradle(或 build.gradle.kts)中的配置:
android { defaultConfig { targetSdkVersion 28 // 其他配置... } }
注意:此方法会限制你使用Android 10及以上版本的专属API,但能完全满足你在Android 10上写入二级存储根目录的需求。
方法2:使用二级存储的应用专属目录(非根目录)
如果你无法降低targetSdkVersion,可写入二级存储上的应用专属目录(无需额外权限),但这不符合你写入根目录的需求,仅作补充说明:
// 获取二级存储的应用专属目录 File secondaryAppDir = context.getExternalFilesDirs(null)[1]; if (secondaryAppDir != null) { // 在此目录下创建文件 File file = new File(secondaryAppDir, "test.txt"); // 写入操作... }
总结
若必须写入二级外部存储根目录且不使用SAF,将targetSdkVersion降至28是唯一可行的官方解决方案。
内容的提问来源于stack exchange,提问作者dunkpi
相关产品推荐
相关产品推荐

