Android中添加两个(多个)FileProvider节点问题

2020-01-30 11:19:58

我们知道在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile(..)来获取uri了,但是在写入数据的时候是可以通过Uri.fromFile(..)来获取uri的,android 官网给出的解决办法是通过FileProvider来解决这一问题,我们需要在AndroidManifest.xml 配制provider节点。


<provider

    android:name="android.support.v4.content.FileProvider"

    android:authorities="${applicationId}.fileProvider"

    android:exported="false"

    android:grantUriPermissions="true"

    tools:replace="android:authorities">

    <meta-data

        android:name="android.support.FILE_PROVIDER_PATHS"

        android:resource="@xml/provider_paths"

        tools:replace="android:resource"/>

</provider>


其中,provider_paths.xml如下所示:


<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->

    <external-path name="beta_external_path" path="Download/"/>

    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->

    <external-path name="beta_external_files_path" path="Android/data/"/>


</paths>


但是此时我们项目中可能会用到其他一些第三方sdk有用到拍照功能的话,他也为了适配android7.0也添加了这个节点,此时有些人可能就不知道如何下手了,其实很简单我们只要重写一个类 继承自FileProvider,然后就按上述方法在添加一个节点就可以了。例如:


<provider

    android:name="com.stay4it.content.MyFileProvider"

    android:authorities="${applicationId}.provider"

    android:grantUriPermissions="true"

    android:exported="false">

    <meta-data

        android:name="android.support.FILE_PROVIDER_PATHS"

        android:resource="@xml/cust_file_paths" />

</provider>


如果你不想自定义FileProvider,那么还有一种方法,那就是把第三方sdk中的路径配置copy到provider_paths.xml即可。


如下所示:


<?xml version="1.0" encoding="utf-8"?>

<paths xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- /storage/emulated/0/Download/${applicationId}/.beta/apk-->

    <external-path name="beta_external_path" path="Download/"/>

    <!--/storage/emulated/0/Android/data/${applicationId}/files/apk/-->

    <external-path name="beta_external_files_path" path="Android/data/"/>


    <external-path name="external_storage_root" path="."/>

    <files-path name="files" path="."/>


</paths>


顺便推荐个开源库:

图片选择器,支持直接拍照并裁剪,单选裁剪,图片多选,裁剪比例设置等



  • 2019-02-28 16:46:26

    android获取视频、图片时添加防盗链

    使用HTTP协议时,可以利用头信息中的Referer做防盗链。 我们在一些网站的网页里访问图片的时候,在图片本站是可以正常看到的,但在外头就不能看到了,这是因为在http的header信息中的referer元素。

  • 2019-03-02 11:29:17

    MySQL学习之索引顺序

    这个问题比较简单,MySQL本身会对条件和索引进行判断,这样写可以用到索引,没有问题。

  • 2019-03-06 11:24:19

    MySQL查看数据库表容量大小

    本文介绍MySQL查看数据库表容量大小的命令语句,提供完整查询语句及实例,方便大家学习使用。

  • 2019-03-13 09:38:11

    写入MySQL报错超出 max_allowed_packet 的问题

    MySQL会根据配置文件会限制server接受的数据包的大小。如果写入大数据时,因为默认的配置太小,插入和更新操作会因为 max_allowed_packet 参数限制,而导致失败。