众所周知,在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的两种建议办法,当然还有其它的办法,像直接修改三方库的源码,都行,选则合适自己项目需求的就好。