TargetSdkVersion升级到30后文件存储
TargetSdkVersion升级到30后文件存储
Android 存储目录
- 私有存储 (Private Storage) : 每个应用在都拥有自己的私有目录,其它应用看不到,彼此也无法访问到该目录。
- 内部存储私有目录 (/data/data/packageName) ;
- 外部存储私有目录 (/sdcard/Android/data/packageName);
- 共享存储 (Shared Storage) : 存储其他应用可访问文件, 包含媒体文件、文档文件以及其他文件,对应设备DCIM、Pictures、Alarms、Music、Notifications、Podcasts、Ringtones、Movies、Download等目录。
- 外部存储:Environment.getExternalStorageDirectory()获取sdcard下的任意文件夹,在SDK29以上已经过期、失效。
外部存储和TargetSdkVersion兼容情况:
- targetSdkVersion = 28,运行后正常读写所有文件,如果不是必须的需求并且是新创建的项目的话,建议把文件按照规范存储在外部存储私有目录 (/sdcard/Android/data/packageName)
- targetSdkVersion = 29,targetSdkVersion 由 低版本 修改到 29,覆盖安装,运行后正常读写。
- targetSdkVersion = 29,卸载旧应用,重新安装新应用,如果读写外部存储,程序崩溃 (open failed: EACCES (Permission denied))
- targetSdkVersion = 29,添加android:requestLegacyExternalStorage=”true”(不启用分区存储),读写正常不报错
- targetSdkVersion = 30,targetSdkVersion 由 低版本 修改到 30,覆盖安装,读写报错,程序崩溃 (open failed: EACCES (Permission denied))
- targetSdkVersion = 30,targetSdkVersion 由 低版本 修改到 30,覆盖安装,增加 android:preserveLegacyExternalStorage=”true”,读写正常不报错
- targetSdkVersion = 30,卸载旧应用,重新安装新应用,不管设置任何配置,如果读写外部存储,程序崩溃 (open failed: EACCES (Permission denied))
特别感谢
特别感谢以下博文
targetSdkVersion 升级到29、30文件处理:https://www.jianshu.com/p/892a2ca5c41e
TargetSdkVersion升级到30后文件存储
https://denchopen.github.io/blog/2023/11/03/TargetSdkVersion升级到30后文件存储/