Android 14升级后单个应用getExternalFilesDir()对应外部存储文件夹隐藏问题咨询
嗨,我来帮你分析下这个问题可能的原因,毕竟Android 14在存储权限和文件可见性上确实有不少细节调整:
目标SDK版本差异:Android 14对目标SDK 34的应用有更严格的存储规范。如果出现问题的应用升级了
targetSdkVersion到34,而另一个应用还停留在更低版本,就可能触发新的隐藏规则。具体来说,目标SDK 34的应用,其getExternalFilesDir()对应的文件夹默认在MTP(文件传输模式)下是隐藏的,除非你在Manifest中声明android:hasFragileUserData="true",或者用户通过应用内的文件分享操作让系统临时暴露这些文件夹。而目标SDK低于34的应用则会沿用旧的可见性逻辑。文件夹属性或命名问题:检查那个隐藏的文件夹是否被设置了隐藏属性(比如通过代码
File.setHidden(true)),或者文件夹名称开头带有.(虽然getExternalFilesDir()默认不会生成这类命名,但如果你的应用后期修改过文件夹名称就有可能)。Android 14的MTP在展示文件时,对带.前缀的隐藏文件/文件夹过滤更严格,这可能是它被隐藏的原因。应用存储权限状态异常:尽管
getExternalFilesDir()属于应用专属存储,不需要READ_EXTERNAL_STORAGE权限,但Android 14可能对权限状态异常的应用做了特殊处理。比如,如果那个问题应用在升级过程中被用户手动重置过存储权限,或者权限状态出现了异常,可能导致系统在MTP模式下不展示其专属文件夹。而另一个应用的权限状态一直正常,所以文件夹仍保持可见。Android 14的MTP展示策略优化:Android 14优化了MTP的文件展示逻辑,为了减少PC端文件列表的杂乱,可能会对某些类型的应用(比如后台运行较多、近期没有文件交互的应用)自动隐藏其专属存储文件夹。如果你的问题应用近期没有通过MTP进行过文件传输操作,而另一个应用经常被用于传文件,系统可能会优先展示后者的文件夹。
给你几个排查建议:
- 对比两个应用的
targetSdkVersion,确认是否是版本差异导致的; - 检查问题应用的Manifest文件,看看是否添加了
android:hasFragileUserData="true",如果没有,添加后重新打包测试; - 使用
adb shell ls -la命令查看问题文件夹的属性,确认是否被设置为隐藏或者命名带.; - 在问题应用内执行一次文件分享操作(比如分享一个文件到其他应用),之后再连接PC查看文件夹是否可见。
备注:内容来源于stack exchange,提问作者petrsyn

