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