Je développe une application avec (au moins) deux versions ayant des noms de packages différents - donc en fait deux applications différentes en ce qui concerne le système Android Android. L'application utilise le partage Facebook, j'ai donc le fournisseur a déclaré dans le manifeste:
<provider Android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
Android:name="com.facebook.FacebookContentProvider"
Android:exported="true"/>
Cela se fait selon les instructions de Facebook: https://developers.facebook.com/docs/sharing/Android
Cela fonctionne bien avec une application, mais la tentative d'installation de la deuxième application sur le même appareil échoue avec l'erreur INSTALL_FAILED_CONFLICTING_PROVIDER. C'est le seul fournisseur défini dans le manifeste, donc je suis presque sûr que c'est le problème. Si je modifie la chaîne du fournisseur pour qu'elle soit différente, elle se bloque lors de la tentative d'ouverture d'une boîte de dialogue de partage Facebook.
J'ai vu des affirmations selon lesquelles il est possible d'utiliser la même application Facebook dans plusieurs Android, mais je ne trouve rien dans la documentation de Facebook à ce sujet. Quelqu'un a-t-il fait cela et comment avez-vous obtenu autour du problème de l'autorité du fournisseur? Merci.
J'ai pu résoudre ce problème en ayant des manifestes séparés pour mes versions de débogage et de version et dans mon manifeste de saveurs de débogage, j'ai ajouté l'extrait de code du fournisseur, mais j'ai défini la valeur exportée sur false. Dans mon manifeste de version, j'ai l'extrait de fournisseur d'origine avec la valeur exportée définie sur true.
Après cela, je n'ai plus eu l'erreur INSTALL_FAILED_CONFLICTING_PROVIDER.
<provider Android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
Android:name="com.facebook.FacebookContentProvider"
Android:exported="false"/>
L'une des solutions possibles que j'ai trouvées est celle décrite ici
http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/
J'utilise déjà cela pour (variantes de débogage/version) Android.support.v4.content.FileProvider et, pour autant que j'ai testé, fonctionne également pour com.facebook.app.FacebookContentProvider.
Ajoutez simplement dans les applications 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}"
}
puis dans le AndroidManifest
<provider Android:authorities="@string/fb_provider_id"
Android:name="com.facebook.FacebookContentProvider"
Android:exported="true"/>
<provider Android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
Android:name="com.facebook.FacebookContentProvider"
Android:exported="false"/>
exporté peut être "vrai"
Si vous avez un projet et plusieurs saveurs (signifie: plusieurs applications avec des ajustements mineurs) comme moi, vous pouvez
1.créer plusieurs applications facebook (à partir de https://developers.facebook.com/apps/ )
2. ajouter des codes pour la saveur de correspondance
3.add facebook_app_id valeur de chaîne dans le dossier de la saveur correspondante.
Exemple:
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>