如何判断特定设备是否需启用SAF及获取应用首次安装的Android版本
判断应用首次安装的Android版本及SAF启用策略
核心结论
Android系统没有直接提供API获取应用首次安装时的系统版本,PackageManager也无法直接拿到这个信息。要实现需求,最可靠的方式是自行存储首次安装时的SDK版本,再根据这个值决定是否强制启用SAF。
具体实现步骤
存储首次安装的SDK版本
在应用首次启动时(比如Application的onCreate方法里),检查SharedPreferences中是否已记录首次安装的SDK版本:SharedPreferences prefs = getSharedPreferences("AppInstallInfo", MODE_PRIVATE); if (!prefs.contains("first_install_sdk")) { int currentSdk = Build.VERSION.SDK_INT; prefs.edit().putInt("first_install_sdk", currentSdk).apply(); }之后每次需要判断时,直接从
SharedPreferences读取这个值即可。基于首次安装版本决定SAF启用逻辑
- 如果首次安装时的
SDK_INT >= 30(Android 11及以上):必须强制启用SAF,这类应用即使后续系统升级,也受Android 11的存储规则限制,无法使用传统外部存储访问数据库。 - 如果首次安装时的
SDK_INT == 29(Android 10):可以继续使用传统存储(前提是Manifest中设置了android:requestLegacyExternalStorage="true",且targetSdkVersion不超过29),无需强制SAF。 - 如果首次安装时的
SDK_INT < 29:不受Android 11存储规则限制,可根据需求选择是否启用SAF。
- 如果首次安装时的
为什么不能用PackageManager直接获取?
PackageManager能获取到PackageInfo中的安装时间(firstInstallTime),但无法关联到当时的系统版本。通过安装时间匹配系统版本发布时间的方式误差极大(比如用户可能在系统发布很久后才安装应用,或者升级系统后重装应用),完全不可靠,不建议使用。
内容的提问来源于stack exchange,提问作者Dana Bell
相关产品推荐
相关产品推荐

