FileProvider的使用

Android  小知识  2024年6月21日 pm6:46发布5个月前更新 城堡大人
124 0 0

前言

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>标签,

  1. 设置android:name属性的值为androidx.core.content.FileProvider;

  2. 设置android:authorities属性的值,可以自定义,通常是应用的包名加上.fileProvider后缀;

  3. 设置android:exported属性的值为false,表示拒绝外部直接访问;

  4. 设置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

参考文章

  1. 安卓FileProvider是如何通过Uri提升文件安全的?

 历史上的今天

  1. 2022: ThreadPoolExecutor简单记录(0条评论)
  2. 2021: 余秀华 : 栀子花开(0条评论)
  3. 2020: WordPress禁用XMLRPC(0条评论)
  4. 2020: [摘]Android异常和性能优化 - OOM异常(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Kotlin的基本语法

前言简单记录一下Kotlin的基本语法。这里只是简单的记录,只是方便自己而已。正文注释注释是为了使代码易于阅读。单行注释单行注释通常是对程序中的某一行代码进行解释,用符号“//”表示//初始化UIinitUI();多行注释多行注释就是注释中的内容可以是多行,以符号“/ ”开...

村上春树:请认真生活

您是属于喜欢说话的人呢,还是不太爱说话?我呢,应该算不爱说话的。虽然视情况看对手,有时会变得口若悬河,不过平常却是闷葫芦一个。也害怕详尽地说明什么,尽量不做这类事情。哪怕话说得不透彻,招致周围的误解(这种事屡屡发生),也照样坦然自若:没办法,人生就是这么回事。不是自吹,这方面我倒是做得很高明。...

Android Studio‘Library projects cannot set applicationId’

前言Library projects cannot set applicationId. applicationId is set to 'com.biumall.usercenter' in default config.摘抄于此,方便自己查阅。正文动态配置module时,当前设置为l...

史铁生:合欢树

10岁那年,我在一次作文比赛中得了第一。母亲那时候还年轻,急着跟我说她自己,说她小时候的作文作得比我还要好,老师甚至不相信那么好的文章会是她写的。“老师找到家来问,是不是家里的大人帮了忙。我那时可能还不到10岁呢。”我听得扫兴,故意笑:“可能?什么叫‘可能还不到’?”她就解释,我装作根本不在意她的话...

StorageManagerService的启动

前言最近在看磁盘的挂载相关内容,涉及StorageManagerService,因此记录一下其的启动等相关内容,方便后续查阅和回顾。个人流水文章,也就是只是方便自己而已。Android P 源码分析正文直入正题。SystemServer.java我们知道SystemServer中...

[摘]Android 系统重启原因分析

重启原因分类1.上层造成重启system_server被杀watchdog重启重要线程阻塞2.kernel造成重启空指针非法地址3.kernel watchdog造成重启,原因不确定内存原因nand驱动log查看步骤及关键字1. 重启后的kernel.log或...