Android Facebook内容提供商权限

nas*_*sch 19 android facebook android-contentprovider

我正在开发一个具有(至少)两种不同包名称的应用程序的应用程序 - 因此就android系统而言实际上是两个不同的应用程序.该应用程序使用Facebook共享,因此我在清单中声明了提供程序:

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>
Run Code Online (Sandbox Code Playgroud)

这是根据Facebook的说明完成的:https://developers.facebook.com/docs/sharing/android

这适用于一个应用程序,但尝试在同一设备上安装第二个应用程序失败,错误为INSTALL_FAILED_CONFLICTING_PROVIDER.这是清单中定义的唯一提供程序,所以我很确定这是问题所在.如果我将提供程序字符串更改为不同的东西,则在尝试打开Facebook共享对话框时会崩溃.

我已经看到声称可以在多个Android应用程序中使用相同的Facebook应用程序,但在Facebook的文档中找不到任何关于它的内容.有没有人这样做过,你是如何解决提供商权限问题的呢?谢谢.

小智 14

我发现的一种可能的解决方案是这里描述的解决方案

http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/

我已经将它用于(调试/发布变体)android.support.v4.content.FileProvider,到目前为止,我已经测试过也适用于com.facebook.app.FacebookContentProvider.

只需添加到应用程序build.gradle中

    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'

        resValue "string", "fb_provider_id", "com.facebook.app.FacebookContentProvider{app_id_1}"
    }

    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        resValue "string", "fb_provider_id", "com.facebook.app.FacebookContentProvider{app_id_2}"
    }
Run Code Online (Sandbox Code Playgroud)

然后在AndroidManifest中

<provider android:authorities="@string/fb_provider_id"
        android:name="com.facebook.FacebookContentProvider"
        android:exported="true"/>
Run Code Online (Sandbox Code Playgroud)


jku*_*ika 11

我能够通过为调试和发布版本提供单独的清单来解决这个问题,在我的调试风格清单中,我为提供程序添加了代码段,但将导出值设置为false.在我的发布风格清单中,我有原始的提供程序片段,导出的设置为true.

在我这样做之后,我不再收到INSTALL_FAILED_CONFLICTING_PROVIDER错误.

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="false"/>
Run Code Online (Sandbox Code Playgroud)