Android Facebook内容提供商权限

时间:2015-06-12 16:18:03

标签: android facebook android-contentprovider

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

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

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

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

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

4 个答案:

答案 0 :(得分:11)

我找到的一种可能的解决方案是这里描述的解决方案

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

然后在AndroidManifest中

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

答案 1 :(得分:10)

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

完成此操作后,我不再收到INSTALL_FAILED_CONFLICTING_PROVIDER错误。

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="false"/>

答案 2 :(得分:2)

<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="false"/>

导出可以是&#34; true&#34;

答案 3 :(得分:1)

如果您有一个像我这样的项目并且有多个flavors(意味着:多个应用做了细微调整),则可以

1。创建多个Facebook应用(来自https://developers.facebook.com/apps/

2.add对应风味的代码

3。在相应的风味文件夹中添加 facebook_app_id 字符串值。

示例:

app / build.gradle

    class bookings_create(LoginRequiredMixin,CreateView):
        login_url = 'Mel:user_login'
        form_class = bookingform
        template_name = 'Mel/bookings_form.html'

        def form_valid(self, form):
            form.instance.booked_by = self.request.user
            return super(bookings_create, self).form_valid(form)

app / src / main / AndroidManifest.xml

...
flavorDimensions "regular"

productFlavors {
    flavour_name {
        dimension "regular"
        resValue "string", "authority", "com.facebook.app.FacebookContentProvider123456789"
    }

app / src / flavor_name / res / values / string.xml

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

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