Android 安卓Facebook内容提供商授权
我正在开发一款应用程序,它(至少)有两种不同的软件包名称,因此就安卓系统而言,实际上有两种不同的应用程序。该应用程序使用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"
<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,我按照你的回答回答了,谢谢你。我很高兴它帮助了你:)