【问题标题】:Android Facebook content provider authorityAndroid Facebook 内容提供商权限
【发布时间】:2015-06-12 16:18:02
【问题描述】:

我正在开发一个具有(至少)两种具有不同包名称的应用程序 - 因此就 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 的文档中找不到任何关于它的信息。有没有人这样做过,您是如何解决提供者权限问题的?谢谢。

【问题讨论】:

  • 如果每种风味都有不同的 applicationId,那么您可以这样做:stackoverflow.com/a/30791242/1426565 并将正确的 applicationId 注入清单中提供者的声明中,因为 $(applicationId) 实际上返回包名称而不是你在 gradle 中定义的 applicationId
  • 最后回到这个问题 - 我要尝试一下,但似乎这会遇到同样的问题,因为应用程序以相同的权限字符串结束,只是来自构建过程而不是而不是直接在清单中。
  • 您可能应该考虑在构建时根据 applicationId 注入不同的值。这实际上是我上周的一个答案,应该可以帮助你做到这一点:stackoverflow.com/a/30791242/1426565
  • 如果我尝试使用不同的值,Facebook 分享功能会导致应用程序崩溃。问题是 Facebook 显然需要为每个 Facebook 应用程序提供相同的提供商权限,所以我看不出如何在多个 Android 应用程序中使用一个 Facebook 应用程序。如果有人可以最终告诉我这是不可能的(最好有支持文件),那将是一个可以接受的答案。
  • 如果您阅读this,您会发现除非您附加图片,否则您不需要 FacebookContentProvider。

标签: android facebook android-contentprovider


【解决方案1】:

我发现的一种可能的解决方案是此处描述的解决方案

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

【讨论】:

  • 谢谢@borko,我听从了你的回答,谢谢。
  • 很高兴它对你有所帮助:)
【解决方案2】:

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

执行此操作后,我不再收到 INSTALL_FAILED_CONFLICTING_PROVIDER 错误。

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

【讨论】:

  • 谢谢,我看看能不能试试。
  • @nasch 你能解决这个问题吗,请发布一个简短的答案,说明你是如何解决这个问题的。创建多个清单文件看起来不是一个明智的解决方案。
  • @Min2 为什么? Android Studio 将在构建时将清单合并到一个文件中。 developer.android.com/tools/building/manifest-merge.html
  • @nasch 当我尝试使用多种口味而不是其他口味时,我无法获得电子邮件 ID,但其他详细信息如姓名和 ID 即将到来。可能是什么原因,我的所有口味都是生产版本,所以我为每个包名称创建了多个具有不同应用程序 ID 的清单。
  • 我不知道,你应该问一个新问题。随意链接到这里。
【解决方案3】:
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="false"/>

导出的可以是“真”

【讨论】:

  • "exported can be "true" true or false"是什么意思?
【解决方案4】:

如果你像我一样有一个项目和多个flavors(意思是:多个应用程序略有调整),你可以

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

2.添加对应风味的代码

3.在对应flavor的文件夹中添加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/flavor_name/res/values/string.xml

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多