2015-06-12 9 views
13

Ich entwickle eine App mit (mindestens) zwei Geschmacksrichtungen mit unterschiedlichen Paketnamen - daher eigentlich zwei verschiedene Apps soweit das Android-System betroffen ist. Die App nutzt Facebook-Sharing, so habe ich die Anbieter im Manifest erklärt:Android Facebook Content Provider Behörde

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

Dieser nach Facebook-Anweisungen durchgeführt wird: https://developers.facebook.com/docs/sharing/android

Dies funktioniert gut mit einer App, sondern versuchen, die zweite App zu installieren auf demselben Gerät schlägt mit dem Fehler INSTALL_FAILED_CONFLICTING_PROVIDER fehl. Dies ist der einzige Anbieter, der im Manifest definiert ist, also bin ich mir ziemlich sicher, dass es das Problem ist. Wenn ich die Provider-Zeichenfolge anders ändere, stürzt sie ab, wenn ich versuche, einen Facebook-Freigabe-Dialog zu öffnen.

Ich habe behauptet, dass es möglich ist, die gleiche Facebook-App in mehreren Android-Apps zu verwenden, aber nichts in der Facebook-Dokumentation darüber finden kann. Hat jemand das getan, und wie haben Sie das Provider-Authority-Problem gelöst? Vielen Dank.

+0

Wenn jeder Geschmack eine andere applicationId hat, dann könnte man so etwas tun: http: // Stackoverflow .com/a/30791242/1426565 und injiziere die korrekte applicationId in die Deklaration des Providers im Manifest, da $ (applicationId) den Paketnamen und nicht die applicationId zurückgibt, die du definiert hast – Guardanis

+0

Endlich komme ich zurück - ich gehe um es zu versuchen, aber es scheint So wird das gleiche Problem auftreten, da die App die gleiche Autoritätszeichenfolge erhält, nur vom Build-Prozess und nicht direkt im Manifest. – nasch

+0

Sie sollten vielleicht in die verschiedenen Werte auf der Basis der applicationId zur Build-Zeit injizieren. Hier ist eigentlich eine Antwort von mir von letzter Woche, die Ihnen helfen sollte: http://stackoverflow.com/a/30791242/1426565 – Guardanis

Antwort

8

Ich konnte dies lösen, indem ich separate Manifeste für meine Debug- und Release-Varianten hatte und in meinem Debug-Flavor-Manifest habe ich das Snippet für den Provider hinzugefügt, aber den exportierten Wert auf false gesetzt. In meinem Release-Flavor-Manifest habe ich das Original-Provider-Snippet mit exportierten auf true gesetzt.

Nachdem ich dies getan habe, habe ich nicht mehr den Fehler INSTALL_FAILED_CONFLICTING_PROVIDER.

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

Vielen Dank, ich werde sehen, ob ich das versuchen kann . – nasch

+0

@nasch Damit Sie dieses Problem lösen können, senden Sie bitte eine kurze Antwort, wie Sie dieses Problem gelöst haben. Erstellen mehrerer Manifest-Dateien, die keine kluge Lösung suchen. – Min2

+1

@ Min2 Warum? Android Studio führt die Manifeste zur Build-Zeit in eine einzelne Datei zusammen. 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"/> 

exportiert kann "true"

6

Eine der möglichen Lösungen, die ich gefunden habe, ist die hier beschriebene

http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/

Ich verwende dies bereits für (debug/Release-Varianten) android.support.v4.content.FileProvider und soweit ich getestet habe funktioniert auch für com.facebook.app.FacebookContentProvider.

Fügen Sie einfach in Anwendungen 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}" 
    } 

und dann in der AndroidManifest

<provider android:authorities="@string/fb_provider_id" 
     android:name="com.facebook.FacebookContentProvider" 
     android:exported="true"/> 
Verwandte Themen