Android Facebook 内容提供商权限
Android Facebook content provider authority
我正在开发一个具有(至少)两种具有不同包名称的风格的应用程序 - 因此就 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 的文档中找不到任何相关内容。有没有人这样做过,你是如何解决提供者权限问题的?谢谢
我能够通过为我的调试和发布版本提供单独的清单来解决这个问题,并且在我的调试版本清单中,我为提供程序添加了代码片段,但将导出的值设置为 false。在我的发布风味清单中,我将原始提供程序片段的导出设置为 true。
执行此操作后,我不再收到 INSTALL_FAILED_CONFLICTING_PROVIDER 错误。
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="false"/>
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="false"/>
导出即可"true"
我找到的可能解决方案之一就是此处描述的解决方案
http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/
我已经将其用于(debug/release 变体)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"/>
如果你像我一样有一个项目和多个 flavors(意思是:多个应用程序稍作调整),你可以
1.create 多个 facebook 应用程序(来自 https://developers.facebook.com/apps/)
2.add 相应口味代码
3.add 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/flavour_name/res/values/string.xml
<string name="facebook_app_id" translatable="false">123456789</string>
我正在开发一个具有(至少)两种具有不同包名称的风格的应用程序 - 因此就 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 的文档中找不到任何相关内容。有没有人这样做过,你是如何解决提供者权限问题的?谢谢
我能够通过为我的调试和发布版本提供单独的清单来解决这个问题,并且在我的调试版本清单中,我为提供程序添加了代码片段,但将导出的值设置为 false。在我的发布风味清单中,我将原始提供程序片段的导出设置为 true。
执行此操作后,我不再收到 INSTALL_FAILED_CONFLICTING_PROVIDER 错误。
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="false"/>
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="false"/>
导出即可"true"
我找到的可能解决方案之一就是此处描述的解决方案
http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/
我已经将其用于(debug/release 变体)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"/>
如果你像我一样有一个项目和多个 flavors(意思是:多个应用程序稍作调整),你可以
1.create 多个 facebook 应用程序(来自 https://developers.facebook.com/apps/)
2.add 相应口味代码
3.add 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/flavour_name/res/values/string.xml
<string name="facebook_app_id" translatable="false">123456789</string>