安卓工作室:INSTALL_FAILED_CONFLICTING_PROVIDER Facebook SDK

12

我在使用Android Studio时遇到了一个奇怪的问题。我有两个Android应用程序,它们都使用相同的Facebook应用程序进行登录和分享图片。使用新的API,需要在清单文件中声明以下内容:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
<provider android:authorities="com.facebook.app.FacebookContentProvider[app_id]"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>

现在,如果设备上已经安装了一个应用程序,并且我尝试安装第二个应用程序,在Android Studio中会出现以下错误:

INSTALL_FAILED_CONFLICTING_PROVIDER

这是一个Facebook提供者的问题,它是我应用程序中唯一的元素。 所以,这样做可能导致我的两个应用程序不能同时安装在同一设备上? 如果有一种方法可以使用相同的提供者并避免此错误,那就好了。


1
你需要在Facebook开发者控制台中创建另一个应用程序,并将其他应用程序ID分配给你的应用程序,并将其与你的第三方清单提供程序条目集成,你可以做到这一点。 - Rajan Bhavsar
2
两个应用属于同一个Facebook应用。无法创建两个独立的应用程序。 - giozh
你有没有找到解决这个问题的方法?我在想是否可能在“Debug”版本中禁用ContentProvider。我仍在研究这个问题。当然,这将禁用该版本的共享功能。 - The Nomad
5个回答

16

我知道这是一个老问题,但我找不到一个清晰明确的答案。我想分享一下我的做法。

你不能使用相同的Facebook应用ID来运行两个不同的应用程序(或者使用两个不同的应用程序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构建设置为根据构建类型或口味填充其值以包含不同的内容。


谢谢,帮助我解决了应用程序具有不同应用程序ID的问题。 - Dokuzov
感谢您提供的解决方案。您节省了很多时间。 - Jatin Jha

4
所以,我的两个应用程序不能在同一设备上同时安装?
是的。
我希望有一种方法可以使用相同的提供者并避免该错误。
以下与Facebook的SDK无关,仅涉及Android及其限制。 Facebook的SDK可能会施加新的限制。
理论上,您可以说App A具有,而App B使用来自App A的提供者。这意味着无法单独使用App B。当用户运行应用程序时,您需要检查是否已安装App A,并强制用户安装它以便能够使用App B。这可能会引起某些用户的不满。如果您希望App A和App B都可以单独使用,那么就可以了,但是它们都必须具有,然后它们不能同时安装。
理想情况下,您可以通过一开始禁用两个<provider>元素(android:enabled="false")来解决这个问题。然后,运行得最快的那个将自己选为提供该设备的提供者,此时它将启用提供者。不幸的是,由于Android bug/limitation|https://issuetracker.google.com/issues/36972261的原因,这并不能解决问题,因为您无论如何都无法同时安装两个提供者。
我倾向于同意Rajan Bhavsar的评论。要么您需要为一个Facebook应用程序ID创建一个Android应用程序,要么您需要为两个Android应用程序创建两个Facebook应用程序ID。

这是一个特殊的情况,其中两个应用程序针对两种不同类型的物理用户(一个应用程序执行另一个应用程序的子集操作),但从未发生过用户可以同时在同一设备上安装两个应用程序的情况。只有在物理设备的测试阶段才会感到烦人(如果我想尝试另一个应用程序,我需要卸载一个应用程序)。 - giozh
@giozh: 那么你目前的方法可能是最好的答案。你可以考虑编写一个Gradle任务,卸载另一个应用程序并安装你想要使用的应用程序,这样你就可以快速地在它们之间切换。或者,使用两个物理设备。而且,据我所知,Facebook可能针对他们要求设置authorities的方式有一些其他的解决方案。 - CommonsWare
我知道这个讨论已经有一年了,但似乎Facebook自己的文档建议开发者可以在多个Android应用程序中使用相同的应用程序ID(https://developers.facebook.com/docs/android/troubleshooting#sharedappid),只是他们没有解释如何解决这个问题。(iOS也是一样的:https://developers.facebook.com/docs/ios/troubleshooting#sharedappid) - Keith
1
但是这个怎么办呢:您可以在多个Android应用程序中使用一个Facebook应用程序ID。只需在另一个应用程序中使用相同的应用程序ID进行登录、共享等操作即可。对于深度链接和通过通知和其他方式打开您的应用程序,我们仅支持单个包名/类名组合。如果您想要多应用程序支持深度链接,请参阅应用链接。 - Tushar Pandey

3

0

在你的清单

  <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"
        }
       }

-3

所以您可以从应用程序中更改提供商名称。 使用应用程序名称Inst代替App_id。


appId是从Facebook开发者控制台获得的ID,必须与给定的ID匹配。 - Martin Mlostek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接