【问题标题】:Content Provider INSTALL_FAILED_CONFLICTING_PROVIDER (installing content provider as a separate apk)内容提供者 INSTALL_FAILED_CONFLICTING_PROVIDER(将内容提供者安装为单独的 apk)
【发布时间】:2011-06-08 02:28:59
【问题描述】:

我有两个使用相同内容提供程序的应用程序,但我不能在两个应用程序中放置相同的内容提供程序 - 它显示 INSTALL_FAILED_CONFLICTING_PROVIDER 错误。所以我把我的内容提供者放在第三个 .apk 中,并从两个应用程序中使用它,它运行良好。

现在的问题是 - 必须先安装内容提供程序 apk,然后才能在设备上安装这两个应用程序中的任何一个。否则,它会在安装过程中显示 Provider not found 错误。

那么,如何确保在安装任何其他 apk 之前安装提供程序 apk?

有没有办法将内容提供者 apk 与其他两个 apk 分别合并,这样它们将作为两个应用程序一起安装并且不会显示 INSTALL_FAILED_CONFLICTING_PROVIDER 错误?

我需要将内容提供者 apk 与这两个应用程序合并,因为用户可能不会同时安装这两个应用程序,或者可能将它们都安装在一个设备上。

【问题讨论】:

  • 这是一个非常有趣的问题。这里解释了一个类似的:stackoverflow.com/questions/3578751/…。我不确定那里是否有适合您的答案,这就是我将其添加为评论的原因。这让我想起了在 C/C++ 中使用头文件时遇到的问题,以及为什么使用 #ifndef/#define
  • @James 感谢您的回复。我想到了您提到的主题中提供的解决方案,但我正在寻找更好的解决方案。将提供程序放在单独的 apk 中并首先安装它可以解决错误 INSTALL_FAILED_CONFLICTING_PROVIDER,我认为比保留两个提供程序更好。但我需要确保首先安装提供程序 apk 或以某种方式合并我提到的 apk。
  • 另见@CommonsWare stackoverflow.com/a/10791144/94363的综合回答

标签: android android-contentprovider apk


【解决方案1】:

您可以通过更改 AndroidManifest.xml 文件中的 android:authorities 的值来解决此问题。错误的原因是您设备上安装的另一个应用程序已经使用了相同的 android:authorities 值。

【讨论】:

    【解决方案2】:

    我能想到的一个解决方案是,将内容提供者作为内部具有不同 packageid 的应用程序的一部分。然后使用 android:exported = true 将其导出。两者可能使用相同的代码。

    在应用程序开始时,您检查设备上是否存在其他内容提供程序,如果存在则开始使用它,否则您将回退到本地内容提供程序。当其他应用程序安装时,它可以进行相同的检查。

    为了保护您的 cotent 提供者免受其他人的侵害,您可以定义一个自定义权限来保护它,以便您的应用程序只能使用它,或者您也可以设置一些自定义身份验证(如一些密钥)来访问内容提供者。您可以在内容提供者的所有方法中拥有此验证码。

    【讨论】:

    • 这似乎是一个可能的解决方案,但不是我所期望的。在android中可能没有办法将两个apk打包为一个。
    【解决方案3】:

    解决这个错误:Installation error: INSTALL_FAILED_CONFLICTING_PROVIDER

    在您的 AndroidManifest.xml 文件中更改 android:authorities 的值,您设备上安装的另一个应用程序已经对 android:authorities 使用了相同的值。

    【讨论】:

      【解决方案4】:

      您在清单文件 (AndroidManifest.xml) 中为这两个程序使用了一个统一数据,例如 Facebook API 注册号或类似的数据:已经安装,而您尝试安装但无法安装。你需要:

      1. 尝试找到类似的东西并检查它是否适合您当前的 程序:

      android:authorities="com.facebook.app.FacebookContentProvider23473465463573466" android:name="com.facebook.FacebookContentProvider" android:exported="true"/>

      1. 检查是否在另一个程序中不重复,如果它是 您尝试安装的程序。

      【讨论】:

        【解决方案5】:

        这意味着您的手机已经有具有相同权限的提供商,由不同的应用程序注册(可能是您的其他示例)。更改您的提供商权限,即android:authorities,您就可以开始了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-05
          • 1970-01-01
          • 2015-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多