安卓Facebook内容提供者权限

23

我正在开发一个应用程序,至少有两个不同的包名(至于安卓系统而言,实际上是两个不同的应用程序)。该应用程序使用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的文档中找不到任何相关信息。是否有人已经这样做了,并且如何解决提供程序授权问题?谢谢。


最终回到这个问题 - 我将尝试它,但似乎会遇到相同的问题,因为应用程序最终具有相同的权限字符串,只是来自构建过程而不是直接在清单中。 - nasch
你或许应该考虑在构建时根据applicationId注入不同的值。这是我上周的一个答案,应该能帮助你做到:https://dev59.com/p10a5IYBdhLWcg3wCEww#30791242 - Cruceo
如果我尝试使用不同的值,Facebook分享功能将导致应用程序崩溃。问题在于Facebook显然要求每个Facebook应用程序具有相同的提供者权限,因此我无法想象如何在多个Android应用程序中使用一个Facebook应用程序。如果有人可以明确告诉我这是不可能的(最好有支持性文件),那将是可以接受的答案。 - nasch
看起来供应商限制只允许您拥有一个具有共享功能的应用程序。您可以使用相同的Facebook应用程序运行其他Android应用程序,但只有其中一个应用程序能够共享可链接内容。您必须确保只有一个应用程序实际上导出提供程序信息,以确保其他应用程序不会发生冲突并且无法安装。 - Cruceo
1
如果你阅读这个链接,你会发现除非你要附加图片,否则你不需要使用FacebookContentProvider。 - Thomas Clowes
显示剩余5条评论
4个回答

15

我找到的其中一种可能的解决方案已在此处描述。

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

我已经在(debug/release variants) 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"/>

谢谢@borko,我按照你的答案做了,谢谢。 - user1510006
1
我很高兴它能帮到你 :) - borko

13

我通过为调试和发布版本创建单独的清单文件来解决了这个问题。在我的调试版本清单文件中,我添加了提供程序的片段,但将其导出值设置为false。在我的发布版本清单文件中,我保留了原始提供程序片段,并将导出设置为true。

这样做后,我不再收到“INSTALL_FAILED_CONFLICTING_PROVIDER”错误消息。

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

谢谢,我会看看能不能试一下。 - nasch
@nasch,你解决了这个问题吗?请发布一个简要答案,说明你是如何解决这个问题的。创建多个清单文件似乎不是一个明智的解决方案。 - Min2
1
@Min2 为什么?Android Studio会在构建时将清单合并为单个文件。https://developer.android.com/tools/building/manifest-merge.html - nasch
@nasch 当我尝试使用多个版本时,其他版本中的电子邮件地址无法获取,但是姓名和ID等其他详细信息都可以获取。可能的原因是什么?我的所有版本都是生产版本,因此我为每个包名称创建了具有不同应用程序ID的多个清单。 - Min2
我不知道,你可能应该提一个新问题。随意在这里链接它。 - nasch
显示剩余3条评论

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

导出可以是“true”


“exported can be "true" true or false" 是什么意思? - Jorgesys

2
如果您像我一样有一个项目和多个口味(表示具有轻微调整的多个应用程序),则可以:
1.创建多个Facebook应用程序(从https://developers.facebook.com/apps/)。
2.为相应的口味添加代码。
3.在相应的口味文件夹中添加facebook_app_id字符串值。
示例:

app/build.gradle

...
flavorDimensions "regular"

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

app/src/main/AndroidManifest.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" />

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

<string name="facebook_app_id" translatable="false">123456789</string>

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