最近在开发flutter项目,遇到fileProvider冲突问题。下面我详细说说这到底是个什么问题。
项目引用了install_plugin自动安装插件、flutter_webview_plugin网页浏览插件。因为这两个插件都需要配置fileProvider。他们的fileProvider配置名字一样,但是authorities不一致,如果不做任何改变,直接配置两个<provider></provider>节点,编译是无法通过的。
<!--自动安装-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider.install"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
tools:replace="android:resource"
android:resource="@xml/file_paths_public"/>
</provider>
<!--网页选择图片-->
<provider
android:name="androidx.core.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/file_paths_public" />
</provider>
如果只配置其中一个,那么要么不能自动安装,要么不能在网页选择文件,如何做到兼容呢?
我们可以自定义一个FileProvider。
创建一个类,直接继承androidx.core.content.FileProvider即可,无需定义变量和方法。
那么我就重新配置网页插件的fileProvider吧。
public class MyFileProvider extends androidx.core.content.FileProvider {
}
<provider
android:name="com.my.MyFileProvider"
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/file_paths_public" />
</provider>
这样就实现了兼容二者。
当然,你也可以统一成一个标准的,但是需要修改插件的fileprovider,这个方案不经济,就不赘述了。
所以,最终的配置如下:
<!--自动安装-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider.install"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
tools:replace="android:resource"
android:resource="@xml/file_paths_public"/>
</provider>
<!--网页选择图片-->
<provider
android:name="com.my.MyFileProvider"
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/file_paths_public" />
</provider>