- INSTALL FAILED CONFLICTING PROVI
- INSTALL FAILED CONFLICTING PROVI
- INSTALL FAILED CONFLICTING PROVI
- INSTALL FAILED CONFLICTING PROVI
- INSTALL FAILED CONFLICTING PROVI
- INSTALL_FAILED_CONFLICTING_PROVI
- INSTALL_FAILED_CONFLICTING_PROVI
- INSTALL_FAILED_CONFLICTING_PROVI
- xcode解决xxx has conflicting provi
- apk 安装错误码 介绍
最近在安装应用时突然出现了 INSTALL_FAILED_CONFLICTING_PROVIDER 问题,从报错信息来看是冲突的 Provider,那到底是什么原因引起的呢?下面给大家分享下造成该问题的根源以及解决方案。

问题根源
该问题的本质报错来自于 ContentProvider,每个 ContentProvider 都包含一个 authority,并且每个 authority 在 Manifest.xml 中必须是唯一的 。
<provider
android:name="android.support.v4.content.FileProvider"
// authority必须为唯一
android:authorities="com.xxx.android.xxx.FileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
每次安装新的应用时,系统会检查该应用包含的 Provider 是否已经存在,检查依据就是每个 Provider 的 authority,否则就会抛出:INSTALL FAILED CONFLICTING PROVIDER
项目中也是根据 authority 来查找对应的 Provider。
public final IContentProvider acquireProvider(Uri uri) {
if (!SCHEME_CONTENT.equals(uri.getScheme())) {
// Uri的scheme必须是content开头,即content://
return null;
}
// 获取authority
final String auth = uri.getAuthority();
if (auth != null) {
// 根据 authority 获取对应的ContentProvider
return acquireProvider(mContext, auth);
}
return null;
}
解决方案
可以根据应用包名指定不同的 Provider:
<provider
android:name="android.support.v4.content.FileProvider"
// authority必须为唯一
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>
通过 ${applicationId}.Fileprovider 方式为每个 Provider 指定唯一的 authority,从而避免了authority 的冲突问题。
采用 applicationId + provider 的方式指定的 authority,在获取时可以做下简单包装:
// 默认名称为FileProvider
public static String getProviderAuthority(Context context){
return getProviderAuthority(context, "FileProvider");
}
// 获取指定的Provider
public static String getProviderAuthority(Context context, String suffix){
return context.getPackageName() + "." + suffix;
}
网友评论