【问题标题】:Android studio: INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdkAndroid 工作室:INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk
【发布时间】:2015-04-27 10:54:31
【问题描述】:

我在使用 android studio 时遇到了一个奇怪的问题。我有两个 Android 应用程序使用 facebook sdk 和相同的 facebook 应用程序登录和共享图片。使用新的 api,需要在 manifest 中声明:

<provider android:authorities="com.facebook.app.FacebookContentProvider[app_id]"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>

现在,如果其中一个应用程序已安装在设备上并且我尝试安装第二个应用程序,我会在 Android Studio 上收到此错误:

INSTALL_FAILED_CONFLICTING_PROVIDER

这是facebook提供商的问题,这是唯一的 我的应用程序中的元素。 那么,这样我的两个应用程序不能同时安装在同一台设备上吗? 我想知道是否有办法使用相同的提供程序并避免该错误。

【问题讨论】:

  • 您应该必须在 Facebook 开发者控制台中创建另一个应用程序并将其他应用程序 ID 分配给您的应用程序并将其与您的清单提供程序条目集成,您就可以做到这一点。
  • 两个应用属于同一个 Facebook 应用。不可能创建两个不同的应用程序
  • 您有没有找到解决方法?正在考虑是否可以在Debug 版本中禁用ContentProvider。还在研究这个问题。当然,这将禁用该版本的共享功能。

标签: android facebook android-studio android-manifest android-facebook


【解决方案1】:

这是一个我知道的老问题,但我找不到明确的答案。我想我会发布我是如何做到的。

您不能让两个不同的应用(或同一个应用使用两个不同的应用 ID)使用同一个 Facebook 应用 ID。这破坏了 ContentProvider 的东西。您需要在 Facebook 开发者专区的主应用下创建一个测试应用。然后从那里取出新的应用 ID 并放在手边。

接下来,在您的 build.gradle 中,将以下条目添加(或附加)到您的 defaultConfig 块中。

    manifestPlaceholders = [ facebook_app_id:"" ]

然后在您的调试配置中添加:

    manifestPlaceholders = [ facebook_app_id:"<the_debug_app_id_you_kept_handy>"]

然后在你的发布配置中添加:

    manifestPlaceholders = [ facebook_app_id:"<the_original_app_id_you_had>" ]

现在,更改您的 AndroidManifest.xml。变化:

    <provider android:authorities="com.facebook.app.FacebookContentProvider<original_app_id>"

到:

    <provider android:authorities="com.facebook.app.FacebookContentProvider${facebook_app_id}"

并且,改变:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="<original_app_id>"/>

到:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebook_app_id}"/>

应该这样做。您所做的是在清单中添加一个占位符。本质上它是一个变量,然后您可以设置您的 gradle 构建以根据构建类型或风格使用不同的东西填充其值。

【讨论】:

  • 感谢帮助我解决了我的应用程序具有不同 applicationIds 的问题
  • 感谢您的解决方案。你节省了很多时间。
【解决方案2】:

那么,这样我的两个应用程序不能同时安装在同一台设备上?

正确。

我想知道是否有办法使用相同的提供程序并避免该错误。

以下内容与 Facebook 的 SDK 无关,仅涉及 Android 及其限制。 Facebook 的 SDK 可能会施加新的令人兴奋的限制。

理论上,您可以说 App A 具有 &lt;provider&gt;,而 App B 使用 App A 的提供程序。这意味着 App B 不能单独使用。当用户运行应用程序时,您必须检查是否安装了应用程序 A 并强制用户安装它以便能够使用应用程序 B。这可能会导致一定程度的用户焦虑。如果您希望 App A 和 App B 都可以单独使用,那很好,但是两者都必须有&lt;provider&gt;,然后它们不能同时安装。

理想情况下,您可以通过在开始时禁用两个 &lt;provider&gt; 元素 (android:enabled="false") 来解决此问题。然后,首先运行的人将选择自己成为该设备的提供者,此时它将启用提供者。唉,由于an Android bug/limitation,这并不能解决问题,因为无论如何你都无法同时安装。

我倾向于同意 Rajan Bhavsar 的评论。您需要为您的一个 Facebook 应用ID 拥有一个 Android 应用,或者您需要两个 为您的两个Facebook 应用ID /em> Android 应用程序。

【讨论】:

  • 这是一种特殊情况,其中两个应用程序用于两种不同类型的物理用户(一个应用程序执行另一个应用程序的操作子集),但用户可以同时安装两个应用程序的情况永远不会发生同时在同一设备上。只是在物理设备上的测试阶段很烦人(如果我想尝试另一个应用程序,我需要卸载一个应用程序)。
  • @giozh:那么您当前的方法可能是您的最佳答案。您可能会考虑为自己编写一个 Gradle 任务,该任务卸载另一个应用程序并安装您尝试使用的应用程序,您可以调用该任务在它们之间快速切换。或者,使用两个物理设备。而且,据我所知,Facebook 有一些其他解决方案来解决这个问题,这些解决方案专门针对他们要求设置 authorities 的方式。
  • 我知道这个讨论已经有一年了,但似乎 Facebook 自己的文档表明开发人员应该能够在多个 Android 应用程序中使用相同的应用程序 ID (developers.facebook.com/docs/android/…),他们只是不'不解释如何解决这个问题。 (iOS 相同:developers.facebook.com/docs/ios/troubleshooting#sharedappid
  • 但是这样呢:您可以在多个 Android 应用程序中使用一个 Facebook 应用程序 ID。只需在另一个应用程序中使用相同的应用程序 ID 进行登录、共享等。对于通过通知和其他方式深度链接和打开您的应用程序,我们仅支持单个包名/类名组合。如果您希望多应用支持深度链接,请参阅应用链接。
【解决方案3】:

据我所知,在相应的提供程序节点 (https://developer.android.com/guide/topics/manifest/provider-element.html) 中对 android:autorities 的名称没有要求,因此您可以通过注入 applicationId 使 URI 唯一:

android:authorities="${applicationId}.com.facebook.app.FacebookContentProvider[app_id]

【讨论】:

    【解决方案4】:

    在您的manifest

      <provider
                    android:name="com.facebook.FacebookContentProvider"
                    android:authorities="@string/authority"
                    android:exported="true" />
    

    在你的 gradle 里面

     productFlavors {
     appStore{
                applicationId "store_app"
                resValue "string", "authority", "com.facebook.app.FacebookContentProviderStoreApp"
            }
           }
    

    【讨论】:

      【解决方案5】:

      因此,您可以从您的一个应用程序中更改提供商名称。 使用 App_id 的 App name Insted。

      【讨论】:

      • appId 是从 facebook 开发者控制台提供的 id,并且必须与给定的 id 匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2020-11-13
      相关资源
      最近更新 更多