深色模式
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读取,很方便。
如果考虑到共享,可以保存到外部存储中。