Android 10升级至11后,preserveLegacyExternalStorage设为true但Environment.isExternalStorageLegacy()返回false的原因排查
下面是几个可能导致Environment.isExternalStorageLegacy()返回false的常见原因,你可以逐一排查:
应用在Android 10上未获取
WRITE_EXTERNAL_STORAGE权限preserveLegacyExternalStorage的核心作用是保留应用在Android 10时期已获得的旧版存储访问权限。如果你的应用在Android 10上从来没请求过WRITE_EXTERNAL_STORAGE,或者用户拒绝了这个权限,那么当系统升级到Android 11后,系统没有可保留的legacy权限状态,自然会返回false。你可以检查应用在Android 10上的权限授予记录确认这一点。应用在系统升级后被重装或清除过数据
这个属性的生效依赖于应用安装后的权限状态记录。如果系统升级后,你卸载重装了应用,或者手动清除了应用的数据,系统会重置应用的存储权限配置,preserveLegacyExternalStorage的设置就会失效,此时应用会按照Android 11的默认存储规则运行,legacy模式也就不再生效。preserveLegacyExternalStorage配置有误
一定要确保这个属性是写在AndroidManifest.xml的<application>标签下,并且拼写完全正确(注意大小写,比如ExternalStorage的S是大写)。如果不小心把它放在了<activity>或者其他标签里,或者拼写错误,系统根本不会识别这个配置,自然不会启用legacy存储模式。应用目标SDK版本的变更影响
如果在系统升级到Android 11后,你更新了应用版本并将targetSdkVersion升级到30(Android 11),但没有正确保留preserveLegacyExternalStorage配置,或者在更新过程中系统判定应用已适配Scoped Storage,那么legacy模式可能会被自动关闭。另外,如果应用在Android 10上的targetSdkVersion高于29,即使设置了requestLegacyExternalStorage,升级到11后也可能无法保留legacy状态。定制ROM的特殊权限逻辑
部分安卓厂商的定制ROM会对系统权限做自定义处理,有些可能在系统升级时自动重置应用的存储权限,忽略preserveLegacyExternalStorage的配置。这种情况下你可以尝试在其他原生Android设备上复现问题,来排除厂商定制的影响。
内容的提问来源于stack exchange,提问作者ahmetvefa53




