web-dev-qa-db-fra.com

Android Autorité du fournisseur de contenu Facebook

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.

20
nasch

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

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"/>
12
borko
<provider Android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
            Android:name="com.facebook.FacebookContentProvider"
            Android:exported="false"/>

exporté peut être "vrai"

2
Arkady Sladkoff

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>
1
Touhidul Islam