preserveLegacyExternalStorage="true"升级后不生效问题排查求助
先厘清两个存储属性的生效范围:
android:requestLegacyExternalStorage仅在targetSdkVersion < 30时有效,当targetSdkVersion升级到30后,这个属性会被系统忽略,无需保留,保留也不会起作用。preserveLegacyExternalStorage生效的硬性前提:
必须是从targetSdkVersion < 30的旧版本直接覆盖安装到targetSdkVersion=30的新版本,如果是卸载旧版本后重装、或者全新安装新版本,该属性完全不生效,系统会直接启用分区存储,此时Environment.isExternalStorageLegacy()必然返回false。请确认测试设备的安装流程是严格的覆盖安装(比如用adb install -r命令),而非卸载重装。检查Manifest配置的正确性:
确保android:preserveLegacyExternalStorage="true"直接写在<application>根标签下,没有嵌套在任何子标签内,同时检查属性名拼写是否完全正确(大小写、单词拼写无错误,比如不要把preserve写成preservee,或者漏写字母)。验证targetSdkVersion是否真正生效:
在代码中打印当前应用的targetSdk版本,确认编译配置的targetSdkVersion=30确实生效:Log.d("StorageDebug", "当前targetSdkVersion: " + getApplicationInfo().targetSdkVersion);避免gradle配置错误导致实际编译的targetSdkVersion仍低于30。
检查
Environment.isExternalStorageLegacy()的调用时机:
该方法的返回值需要在Application初始化完成后才能准确获取,不要在静态代码块、ContentProvider的onCreate等过早的生命周期调用。建议在Activity的onCreate或之后的方法中调用测试。如果上述排查都无效,可考虑迁移替代方案:
若无法触发legacy存储模式,可通过ACTION_OPEN_DOCUMENT_TREE引导用户授权访问旧的外部存储目录,然后手动将文件迁移至应用专属存储目录(getExternalFilesDir(null)),该目录属于应用私有区域,无需特殊权限即可自由读写。
内容的提问来源于stack exchange,提问作者Liu Tom

