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>


顺便推荐个开源库:

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



  • 2020-02-19 23:12:44

    Laravel 从 $request 到 $response 的过程解析二(必读)

    laravel 的请求会组装成 $request 对象,然后会依次经过中间件(前置部分),最终到达 url 指向的控制器方法,然后把返回数据组装为 $response 对象返回,再依次经过中间件 (后置部分),最终返回。

  • 2020-02-19 23:15:24

    PHP 闭包(Closure)

    闭包(Closure)又叫做匿名函数,也就是没有定义名字的函数。比如下面的例子:

  • 2020-02-19 23:26:58

    php array_pop 删除数组最后一个元素实例

    php array_pop函数将数组最后一个单元弹出(出栈),即删除数组的最后一个元素。本文章通过php实例向大家讲解array_pop函数的使用方法。