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>


顺便推荐个开源库:

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



  • 2017-02-10 15:24:14

    linux学习之——vim简明教程

    学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文本编辑器了,非常地难学,但是却不可思议地好用。 我建议下面这四个步骤: 存活 感觉良好 觉得更好,更强,更快 使用VIM的超能力

  • 2017-02-10 16:22:13

    git历史记录查询

    查看提交历史:git log 查看提交历史并显示版本间的差异:git log -p 查看指定历史:git log xxx(sha1值) -p 查看提交历史(指定时间):

  • 2017-02-13 17:50:05

    cURL error 60: SSL certificate problem: unable to get local issuer certificate

    Drupal 8 version uses Guzzle Http Client internally, but under the hood it may use cURL or PHP internals. If you installed PHP cURL on your PHP server it typically uses cURL and you may see an exception with error Peer certificate cannot be authenticated with known CA certificates or error code CURLE_SSL_CACERT (60).

  • 2017-02-16 08:09:01

    HTML中PRE和p的区别

    pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。 <pre> 标签的一个常见应用就是用来表示计算机的源代码。