Android FileProvider冲突处理方法

       众所周知,在android7.0是上做适配,需要额外添加FileProvider,因为选则文件的uri发现了一些变化。当然在android10.0的基础上做适配的话,就发现另外一些变化,这个可以另外一篇文章,但是总体变化不大。android10的适配

       今天要说的问题是,在日常项目开发中,因为种种需求,可能会引入一些三方库,这个三方库,一般都早已经适配了7.0,所以有自己path路径,而我们因为在项目开发的时候,自己应该也有文件选则路径,这个结果,就是导致项目报错。一般是下面这种错误,意思就是自己项目跟三方的开源库冲突了。

        遇见这种情况,一般推荐几种做法,第一种项目本身两个FileProvider,两个合成一个即可,如下图所示

<application>
   ...
<!-- 其他 -->
 <provider
    android:name="android.support.v4.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>
<!-- 广点通 -->
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/gdt_file_path" />
  </provider>
 ...
</application>

       这个是比较明显的,因为使用三方的SDK,三方的有自己个处理路径判断,这个时候我们合并一下就OK了,把file_paths文件与gdt_file_path,两个文件的内容合并成一个就OK。具体操作步骤就不详细说了,贴一下示例代码

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
   <!-- 广点通 -->
    <external-path
        name="gdt_sdk_download_path"
        path="GDTDOWNLOAD" />
    <external-cache-path
        name="gdt_sdk_download_path1"
        path="com_qq_e_download" />
    <cache-path
        name="gdt_sdk_download_path2"
        path="com_qq_e_download" />
   <!-- 其他 -->
    <external-files-path 
        name="external_files" path="."/>
</paths>

      合并完成之后,自己重新声明一个新的file文件即可,如下图所示:

<application>
   ...
<!-- 合并后 -->
 <provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/news_file_paths" />
 </provider>
 ...
</application>

  针对这种方法呢,还有一个问题就是,有的时候三方库,没有提供FileProvider的配置文件,那这个时候需要我们自己去三方库的源码里翻一下,都是同样的路径在xml下边,找到之后做一下兼容即可。

       上面那种方法比较常用,还有一种办法就是,自定义FileProvider,不直接用系统指定的,也可以解决该冲突,如代码所示

public class MyFileProvider extends FileProvider{
}

      继承之后也不需要处理什么东西,在配置文件改一下名字即可

<application>
    ...
 <!-- 其他 -->
  <provider
    android:name="android.support.v4.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>
 <!-- 广点通 -->
  <provider
     android:name=".util.MyFileProvider"//自定义的FileProvider的路径
     android:authorities="${applicationId}.fileProvider"
     android:exported="false"
     android:grantUriPermissions="true"
     tools:replace="name,authorities,exported,grantUriPermissions">
     <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/gdt_file_path"
        tools:replace="name,resource" />
   </provider>
   ...
</application>

 好了以上就是处理FileProvider的两种建议办法,当然还有其它的办法,像直接修改三方库的源码,都行,选则合适自己项目需求的就好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章