que - Autoridad del proveedor de contenido de Facebook para Android
emm android (4)
Estoy desarrollando una aplicación con (al menos) dos sabores con diferentes nombres de paquetes; por lo tanto, en realidad se trata de dos aplicaciones diferentes en lo que respecta al sistema Android. La aplicación utiliza Facebook para compartir, por lo que he declarado al proveedor en el manifiesto:
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="true"/>
Esto se hace de acuerdo con las instrucciones de Facebook: https://developers.facebook.com/docs/sharing/android
Esto funciona bien con una aplicación, pero intentar instalar la segunda aplicación en el mismo dispositivo falla con el error INSTALL_FAILED_CONFLICTING_PROVIDER. Este es el único proveedor definido en el manifiesto, así que estoy bastante seguro de que es el problema. Si cambio la cadena del proveedor para que sea diferente, se bloquea al intentar abrir un cuadro de diálogo de compartir de Facebook.
He visto afirmaciones de que es posible usar la misma aplicación de Facebook en varias aplicaciones de Android, pero no puedo encontrar nada en la documentación de Facebook al respecto. ¿Alguien ha hecho esto y cómo resolvió el problema de la autoridad del proveedor? Gracias.
Pude resolver esto al tener manifiestos separados para mis sabores de depuración y lanzamiento y en mi manifiesto de depuración de sabores, agregué el fragmento para el proveedor pero establecí el valor exportado en falso. En mi manifiesto de lanzamiento, tengo el fragmento de proveedor original con el conjunto exportado como verdadero.
Después de hacer esto, ya no recibí el error INSTALL_FAILED_CONFLICTING_PROVIDER.
<provider android:authorities="com.facebook.app.FacebookContentProvider{app id here}"
android:name="com.facebook.FacebookContentProvider"
android:exported="false"/>
Si tiene un proyecto y varios flavors (significa: múltiples aplicaciones con pequeños ajustes) como yo, puede
1.create una aplicación de Facebook múltiple (desde https://developers.facebook.com/apps/ )
Códigos 2.add para correspoding sabor
3.add facebook_app_id cadena valor en la carpeta del sabor correspondiente.
Ejemplo:
app / build.gradle
...
flavorDimensions "regular"
productFlavors {
flavour_name {
dimension "regular"
resValue "string", "authority", "com.facebook.app.FacebookContentProvider123456789"
}
aplicación / 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>
Una de las posibles soluciones que he encontrado es la que se describe aquí.
http://gradlewhy.ghost.io/overcoming-install-failed-conflicting-provider/
Ya estoy usando esto para (depurar / lanzar variantes) android.support.v4.content.FileProvider y hasta ahora he probado que también funciona para com.facebook.app.FacebookContentProvider.
Solo agrégalo a las aplicaciones 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}"
}
y luego en el 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"/>
exportado puede ser "verdadero"