2015-06-12 107 views
13

我正在开发一个应用程序(至少)有两种不同的包名 - 因此实际上是两个不同的应用程序,只要android系统有关。该应用程序使用Facebook的分享,所以我在清单中声明的​​供应商: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

如果每个味道都有不同的applicationID,那么你可以做这样的事情:HTTP://计算器.com/a/30791242/1426565并在清单中的提供者声明中注入正确的applicationId,因为$(applicationId)实际返回包名,而不是您在gradle中定义的applicationId – Guardanis

+0

最后回到此 - 我要去尝试它,但似乎像这样会遇到同样的问题,因为应用程序结束时只有来自构建过程的权限字符串,而不是直接在清单中。 – nasch

+0

您应该看看在构建时基于applicationId注入不同的值。这里实际上是我上周的答案,应该可以帮助你做到这一点:http://stackoverflow.com/a/30791242/1426565 – Guardanis

回答

8

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

我这样做后,我不再有INSTALL_FAILED_CONFLICTING_PROVIDER错误。

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

谢谢,我会看看我是否可以尝试。 – nasch

+0

@nasch所以你能解决这个问题,请发表一个简单的答案,你如何解决这个问题。创建多个清单文件不是一个明智的解决方案。 – Min2

+1

@ Min2为什么? Android Studio将在构建时将清单合并到单个文件中。 https://developer.android.com/tools/building/manifest-merge.html – nasch

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

出口可以是“真实的”

6

一个我已经找到了可能的解决方案是在这里

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