Android 7.0的新特性规定,对于targetSdkVersion大于25应用,Android 框架执行的 StrictMode API 政策禁止在应用外部公开 ,如果使用file://URI 则会抛出FileUriExposedException 异常.要应用间共享文件,需要发送一项 content://URI ,并授予URI临时访问权限,这时就用到了FileProvider.
一、创建res/xml/file_paths.xml,并在file_paths.xml中指定文件存储的区域和路径
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path
name="external"
path="demo" />
<external-path
name="external_storage_root"
path="." />
</paths>
在path节点内部支持以下几个子节点,分别为:
子节点 | 含义 |
---|---|
<root-path> | 代表设备的根目录 new File("/") |
<files-path> | 代表 context.getFileDir() |
<cache-path> | 代表 context.getCacheDir() |
<external-path> | 代表 Environment.getExternalStorageDirectory() |
<external-files-path> | 代表 context.getExternalFilesDirs() |
<external-cache-path> | 代表 getExternalCacheDirs() |
每个节点都使用两个属性:
- name
- path
二、在AndroidManifest中进行注册
<manifest>
...
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="<包名>.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
三、使用FileProvider
Uri uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", file);
注意:如果项目中出现多个FileProvider,可以创建一个类继承FileProvider再注册到Manifest中即可