美文网首页
INSTALL FAILED CONFLICTING PROVI

INSTALL FAILED CONFLICTING PROVI

作者: godliness | 来源:发表于2019-11-17 13:28 被阅读0次

最近在安装应用时突然出现了 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;
}

相关文章

网友评论

      本文标题:INSTALL FAILED CONFLICTING PROVI

      本文链接:https://www.haomeiwen.com/subject/aieyictx.html