前言
在Android中经常会遇到存储和访问文件,一般情况下我们会使用Context#openFileOutput()
或者Context#getCacheDir()
来获得文件存储路径,但是这两种方式存储的文件只能在APP内部访问,不能共享给其他APP访问。这个时候我们就需要将文件存储在外部存储卡上面,使用Environment#getExternalStorageDirectory()
或者Environment#getDownloadCacheDirectory()
,但是这样带来了两个潜在的问题。
- 所有应用都可以访问该数据,造成安全问题,我们只希望部分应用可访问。
- 为了读写该文件APP需要有
READ_EXTERNAL_STORAGE
和WRITE_EXTERNAL_STORAGE
权限,需要访问的其他APP也需要READ_EXTERNAL_STORAGE
权限才能读取。对于内容的提供者我们不能确保访问的应用程序就一定有READ_EXTERNAL_STORAGE
权限 。
因此使用file://... URI
来共享文件并不好,替代方案就是定义一个ContentProvider,使用content://... URI
来共享文,而FileProvider是对ContentProvider的进一步封装,专门用于文件共享。
FileProvider是什么
FileProvider是ContentProvider的一个特殊子类,它通过创建一个 content:// Uri 来使应用程序相关的文件实现安全共享:file:/// Uri.
之前我们在使用URL来访问内容的时候可以使用 Intent.setFlags() 来设置一些临时访问权限,这些Google认为是不安全的,所以从Android7.0开始执行了“StrictMode API 政策禁”,来使用FileProvider来解决这个访问权限问题。