转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/119650111 本文出自【赵彦军的博客】
沙箱私有目录
val filesDir = filesDir
/data/user/0/com.example.myapplication/files
val cacheDir = cacheDir
/data/user/0/com.example.myapplication/cache
是 app 的私有目录,也称沙箱。App 卸载后,此目录随之删除。文件管理器无法访问,除非root 。还有一种方法,把手机连到到电脑上,运行 app debug 模式,用 AndroidStudio 工具是可以看到的。
cacheDir :机身内存不足时,文件会被删除

需要注意的是,app 的 SharedPreferences 和 SQLiteDatabase 持久化应用相关数据也在这个目录的父目录。
SharedPreferences: /data/user/0/app_package_name/shared_prefs
SQLiteDatabase: /data/user/0/app_package_name/databases
Context 提供了一个简便方式,来获取一个内部私有目录
val dir = getDir("myFile", Context.MODE_PRIVATE)
/data/user/0/app_package_name/myFile
- mode 是指文件夹的访问权限而并不包括其子文件夹和文件的访问权限:
- MODE_PRIVATE :该文件只能被当前程序读写;
- MODE_APPEND : 以追加方式打开该文件,应用程序可以向该文件中追加内容。
- MODE_WORLD_READABLE :该文件的内容可以 被其他程序读取。
- MODE_WORLD_WRITEABLE :该文件的内容可以 被其他程序读取、写入。
外部存储空间中的应用私有目录
val externalCacheDir = externalCacheDir?.absolutePath
/storage/emulated/0/Android/data/app_package_name/cache
val filesDir = getExternalFilesDir(null)
/storage/emulated/0/Android/data/app_package_name/files
这个目录,是沙箱目录,App 卸载后,此目录随之删除 ,这个目录可以通过文件管理器访问。有一点是特别需要注意的,这个目录存储在 SD 卡上,如果用户把 SD 卡卸载了,那么这个目录将不可用。
内部私有目录、外部私有目录 均不需要申请权限。
值得注意的是,与内部存储空间的应用私有目录不同的是:
- 第一,默认情况下,系统并不会自动创建外部存储空间的应用私有目录。只有在应用需要的时候,开发人员通过 SDK 提供的 API 创建该目录文件夹和操作文件夹内容。
- 第二,自 Android 7.0 开始,系统对应用私有目录的访问权限进一步限制。其他 App 无法通过 file:// 这种形式的 Uri 直接读写该目录下的文件内容,而是通过 FileProvider 访问。
- 第三,宿主 App 可以直接读写内部存储空间中的应用私有目录;而在 4.4 版本开始,宿主 App 才可以直接读写外部存储空间中的应用私有目录,使开发人员无需在 Manifest 文件中或者动态申请外部存储空间的文件读写权限。
- 而相同点在于:同属于应用私有目录,当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。
val state = EnvironmentCompat.getStorageState(file)
if (state == Environment.MEDIA_MOUNTED) {
}
外部存储公有目录
val dataDir = Environment.getDataDirectory().absolutePath
/data
val storageDir = Environment.getStorageDirectory().absolutePath
/storage
需要注意的是:这两个目录需要权限声明 , 在 6.0 及以上还需要动态申请权限
如果没有权限,app 会崩溃
ActivityCompat.requestPermissions(
this,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE
),
200
)
|