前言
自Android 7.0开始,Android 框架开启了严格模式(StrictMode),禁止应用将file:///开头的Uri共享给其他的应用读写文件,否则会收到FileUriExposedException的异常。因此,Android提供了新的文件共享机制FileProvider。
记录一下FileProvider的使用,方便自己查阅和学习。
正文
下面简单记录一下FileProvider的使用。
第一步
AndroidManifest.xml中添加provider配置
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
在Manifest文件中添加<provider>
标签,
设置android:authorities属性的值,可以自定义,通常是应用的包名加上.fileProvider后缀;
设置android:exported属性的值为false,表示拒绝外部直接访问;
设置android:grantUriPermissions的属性为true,表示可以为文件赋予临时访问权限。
第二步
在需要模块中创建file_paths.xml,我这以BiuFile2为例,具体路径如下:
/BiuFile2/src/main/res/xml/file_paths.xml
然后在file_paths.xml,在这个文件中创建<paths>
根结点,并在该节点下配置共享的文件夹,示例配置如下:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-path name="external-path" path="." /> <external-cache-path name="external-cache-path" path="." /> <external-files-path name="external-files-path" path="." /> <files-path name="files_path" path="." /> <cache-path name="cache-path" path="." /> <root-path name="root" path="." /> </paths>
具体意思最好参考一官方文档,这里步介绍哈
第三步
这一步也就是如何分享文件。
创建分享的文件uri
Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileProvider", new File(path));
fileProvider跟AndroidManifest.xml配置的要一样咯!
我这传入的path为
/storage/udisk2/AAAA.flac
上面创建的contentUri为
content://com.biumall.file2.fileProvider/root/storage/udisk2/AAAA.flac
参考文章
《
© 版权声明