前言
从 Android N(7.0) 开始,将严格执行 StrictMode 模式。而从 Android N 开始,将不允许在 App 间,使用 file:// 的方式,传递一个 File ,否者会抛出 FileUriExposedException 的异常引发 Crash。解决方案就是通过FileProvider 用 content:// 代替 file://,需要开发者主动升级 targetSdkVersion 到 24 才会执行此策略。
其实在 Android 7.0 出来后我们应用就 就开始适配了,应用中加入了FileProvider,但偶尔还是会碰到 FileProvider 导致的问题,所以这边文章准备彻彻底底的分析下FileProvider,揪出FileProvider的庐山真面目。
Android 应用文件存储目录
内部存储空间中的应用私有目录
每安装一个 App 系统都会在内部存储空间的 data/data 目录下以应用包名为名字自动创建与之对应的文件夹,这个文件夹用于持久化 App 中的 WebView 缓存页面信息、SharedPreferences、SQLiteDatabase等应用相关数据。当用户卸载 App 时,系统自动删除 data/data 目录下对应包名的文件夹及其内容。
Android SDK 提供 获取并操作内部存储空间中的应用私有目录的方法如下:
context.getFilesDir()
context.getCacheDir()
context.deleteFile()
context.fileList()
Environment.getDataDirectory()
外部存储空间中的应用私有目录
考虑到普通用户无法访问应用的内部存储空间,比如用户想从应用里面保存一张图片,那么这张图片应该存储在外部存储空间,用户才能访问的到,外部存储空间路径为:/storage/emulated/0/Android/data/
默认情况下,系统并不会自动创建外部存储空间的应用私有目录。只有在应用需要的时候,开发人员通过 SDK 提供的 API 创建该目录文件夹和操作文件夹内容。
当用户卸载 App 时,系统也会自动删除外部存储空间下的对应 App 私有目录文件夹及其内容。
Android SDK 中提供给开发人员直接操作外部存储空间下的应用私有目录的方法如下:
context.getExternalFilesDir()
context.getExternalCacheDir()
Environment.getExternalStorageDirectory()
外部存储空间中的公共目录
外部存储空间中的公共目录用来存放当应用被卸载时,仍然可以保存在设备中的信息,如:拍