Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/201.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓Facebook内容提供商授权_Android_Facebook_Android Contentprovider - Fatal编程技术网

Android 安卓Facebook内容提供商授权

Android 安卓Facebook内容提供商授权,android,facebook,android-contentprovider,Android,Facebook,Android Contentprovider,我正在开发一款应用程序,它(至少)有两种不同的软件包名称,因此就安卓系统而言,实际上有两种不同的应用程序。该应用程序使用Facebook共享,因此我在清单中声明了提供商: <provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}" android:name="com.facebook.FacebookContentProvider"

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

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

这是根据Facebook的指示完成的:

这在一个应用程序上运行良好,但尝试在同一设备上安装第二个应用程序失败,错误为install\u FAILED\u PROVIDER。这是清单中唯一定义的提供者,所以我很确定这就是问题所在。如果我将提供者字符串更改为其他内容,则在尝试打开Facebook共享对话框时会崩溃


我看到有人声称可以在多个android应用程序中使用同一个Facebook应用程序,但在Facebook的文档中找不到任何关于它的信息。有人这样做过吗?您是如何解决提供者权限问题的?谢谢。

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

完成此操作后,我不再收到安装失败\u冲突\u提供程序错误




导出可以是“真的”

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

我已经在android.support.v4.content.FileProvider(调试/发行版本变体)中使用了它,并且到目前为止,我已经测试过它也适用于com.facebook.app.facebook contentProvider

只需添加到apps 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}"
    }
...
flavorDimensions "regular"

productFlavors {
    flavour_name {
        dimension "regular"
        resValue "string", "authority", "com.facebook.app.FacebookContentProvider123456789"
    }
然后在AndroidManifest中

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

如果你有一个项目和多个(意思是:多个应用程序有小改动)像我一样,你可以

1.创建多个facebook应用程序(从)

2.添加相应的编码

3.在相应的flavor文件夹中添加facebook\u app\u id字符串值

例如:

app/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}"
    }
...
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\u name/res/values/string.xml

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

如果每种风格都有不同的applicationId,那么您可以这样做:将正确的applicationId注入到清单中提供者的声明中,因为$(applicationId)实际上返回包名,而不是您在逐步返回时定义的applicationId-我将尝试一下,但这似乎会遇到同样的问题,因为应用程序最终会使用相同的权限字符串,只是从构建过程而不是直接在清单中。您可能应该考虑在构建时基于applicationId注入不同的值。事实上,上周我有一个答案可以帮助你做到这一点:如果我尝试使用不同的值,Facebook共享功能会使应用程序崩溃。问题是,Facebook显然要求每个Facebook应用程序具有相同的提供商权限,因此我不知道如何在多个Android应用程序中使用一个Facebook应用程序。如果有人能确凿地告诉我,这是不可能的(最好有支持文档),这将是一个可接受的答案。如果您阅读,您将看到您不需要FacebookContentProvider,除非您附加图像。谢谢,我会看看是否可以试试。@nasch那么你能解决这个问题吗?请给出一个简短的回答,说明你是如何解决这个问题的。创建多个清单文件看起来不是明智的解决方案。@Min2为什么?Android Studio将在构建时将清单合并到单个文件中@nasch当我尝试使用多个falvours而不是其他版本时,我无法获得电子邮件id,但其他详细信息如名称和id。可能是什么原因,我的所有版本都是生产版本,因此我为每个软件包名称创建了多个具有不同应用id的清单。我不知道,你可能应该问一个新问题。请随意链接到这里。谢谢@borko,我按照你的回答回答了,谢谢你。我很高兴它帮助了你:)