Android Zone

Android FileProvider冲突处理方法

2020-01-15  本文已影响0人  翻译不了的声响

项目里有多个module应用FileProvider时,编译器在编译项目合并 Manifest文件时候就抛出了provider冲突问题。定义FileProvider时,用的都是v4包提供的FileProvider类来读写文件,所以会导致冲突。

那么多个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>

处理方法:
① 合并xml文件
1)把两个FileProvider的配置引用文件file_paths.xmlgdt_file_path.xml合并成一个new_file_paths.xml文件:

<?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>

2)在 Manifest文件中重新配置 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/new_file_paths" />
 </provider>
 ...
</application>

② 重写FileProvider
1)重写v4包提供的 FileProvider类:

public class GDTFileProvider extends FileProvider{
}

2)在 Manifest文件中重新配置 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=".utils.GDTFileProvider"//自定义的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>
上一篇下一篇

猜你喜欢

热点阅读