Android工作室:INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk

gio*_*ozh 11 android facebook android-manifest android-facebook android-studio

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

<provider android:authorities="com.facebook.app.FacebookContentProvider[app_id]"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>
Run Code Online (Sandbox Code Playgroud)

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

INSTALL_FAILED_CONFLICTING_PROVIDER
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*mon 15

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

您不能使用相同的Facebook应用ID,使用两个不同的应用(或使用两个不同应用ID的相同应用).这打破了ContentProvider的内容.您需要在Facebook开发人员区域的主应用程序下创建一个测试应用程序.然后从那里获取新的应用程序ID并保持方便.

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

    manifestPlaceholders = [ facebook_app_id:"" ]
Run Code Online (Sandbox Code Playgroud)

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

    manifestPlaceholders = [ facebook_app_id:"<the_debug_app_id_you_kept_handy>"]
Run Code Online (Sandbox Code Playgroud)

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

    manifestPlaceholders = [ facebook_app_id:"<the_original_app_id_you_had>" ]
Run Code Online (Sandbox Code Playgroud)

现在,更改AndroidManifest.xml.更改:

    <provider android:authorities="com.facebook.app.FacebookContentProvider<original_app_id>"
Run Code Online (Sandbox Code Playgroud)

至:

    <provider android:authorities="com.facebook.app.FacebookContentProvider${facebook_app_id}"
Run Code Online (Sandbox Code Playgroud)

并且,改变:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="<original_app_id>"/>
Run Code Online (Sandbox Code Playgroud)

至:

    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebook_app_id}"/>
Run Code Online (Sandbox Code Playgroud)

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


Com*_*are 4

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

正确的。

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

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

从理论上讲,您可以说应用程序 A 有,<provider>而应用程序 B 使用应用程序 A 的提供程序。这意味着应用程序 B 不能单独使用。当用户运行应用程序时,您必须检查应用程序 A 是否已安装,并强制用户安装它才能使用应用程序 B。这可能会引起一定程度的用户焦虑。如果您希望应用程序 A 和应用程序 B 都可以单独使用,那没问题,但是两者都必须具有<provider>并且不能同时安装。

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

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