深色模式
Android 文件存储
内部存储(App私有)
- 内部存储中,App私有的目录。
- 位于
/data/data/{packageName}。 - 会随App的卸载而删除。
- 其它App不可访问。
- 适合存储与App运行有关的文件。
权限
- 对于本App,默认拥有完全的访问权限。
- 对于其它App,无法访问此目录。
- 对于手机用户,访问需要root权限。
访问方式
获取根目录:
context.getDataDir(),路径:/data/data/{packageName}获取文件目录:
context.getFilesDir(),路径:/data/data/{packageName}/files获取缓存目录:
context.getCacheDir(),路径:/data/data/{packageName}/cache流读取:
context.openFileInput("fileName")流写入:
context.openFileOutput("fileName", Context.MODE_PRIVATE)
外部存储(App专属)
- 外部存储中,App私有的目录。
- 位于
/storage/emulated/0/Android/data/{packageName} - 会随App的卸载而删除。
- 其它App可以访问,要申请权限。
- 适合存储与App运行有关,但敏感性不高的文件。
TIP
Android 10 开始,可以在Manifest中设置android:hasFragileUserData=true,当卸载App时,可由用户选择是否保存App外部存储的数据。如果保留,那么重新安装时,这些数据仍然可用。
权限
对于本App
Android 4.4 以前,要声明
android.permission.READ_EXTERNAL_STORAGE或android.permission.WRITE_EXTERNAL_STORAGE。从Android 4.4 开始,可直接访问,不必申请权限。
对于其它App
申请外部存储权限以后,可以访问。
对于手机用户:
可以访问
访问方式
INFO
外部存储的根目录是/storage/emulated/0,它有2个链接路径:
/storage/self/primary->/storage/emulated/0/sdcard->/storage/self/primary
获取文件目录:
context.getExternalFilesDir(),路径:/sdcard/Android/data/{packageName}/files
获取缓存目录:
context.getExternalCacheDir(),路径:/sdcard/Android/data/{packageName}/cache
外部存储(公开)
位于/storage/emulated/0,早期,此目录可以任意读写,存在巨大的安全问题。
经过多个版本变更,相关权限要求逐渐严格。
Android 6.0 以前:
声明READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE即可访问外部存储的所有目录。
Android 6.0 开始:
需要动态申请READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE。
Android 10 开始:
建议使用分区存储,不能任意访问外部存储目录的所有内容。(可以禁用)
Android 11 开始:
强制使用分区存储。
Android 13 开始:
细化媒体权限,将READ_EXTERNAL_STORAGE拆分为READ_MEDIA_AUDIO、READ_MEDIA_IMAGES、READ_MEDIA_VIDEO
READ_EXTERNAL_STORAGE与WRITE_EXTERNAL_STORAGE已废弃,申请此权限将被拒绝。
不能使用File API访问此目录。
实践
优先保存在外部存储(App专属),因为权限要求低,能过能File API读取,很方便。
如果考虑到共享,可以保存到外部存储中。
