Android工作室:INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk

时间:2015-04-27 10:54:32

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

我正面临着android studio的一个奇怪问题。我有两个Android应用程序使用facebook sdk与相同的Facebook应用程序登录和分享图片。使用新的api,有必要声明内部清单:

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

现在如果其中一个应用程序已经安装在设备上并且我尝试安装第二个应用程序,我在Android studio上获得此错误:

INSTALL_FAILED_CONFLICTING_PROVIDER

这是必须的facebook提供商的问题,这是唯一的      我的应用内的元素。 那么,这样我的两个应用程序无法在同一台设备上同时安装? 我想如果有一种方法可以使用相同的提供程序并避免该错误。

5 个答案:

答案 0 :(得分:15)

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

使用相同的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构建,根据构建类型或风格用不同的东西填充它的值。

答案 1 :(得分:4)

  

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

正确。

  

我想如果有一种方法可以使用相同的提供程序并避免该错误。

以下与Facebook的SDK无关,但仅涉及Android及其限制。 Facebook的SDK可能会带来新的令人兴奋的限制。

理论上,您可以说App A具有<provider>而App B使用App A中的提供程序。这意味着App B不能单独使用。当用户运行应用程序时,您必须检查App A是否已安装并强制用户安装它以便能够使用App B.这可能会导致一些用户焦虑。如果你想要App A和App B都可以单独使用,那很好,但是两者都必须有<provider>,然后它们不能同时安装。

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

在您的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"
        }
       }

答案 4 :(得分:-2)

因此,您可以从其中一个应用更改提供商名称。 使用应用程序名称Inst ed of App_id。