10

Sto affrontando uno strano problema con Android Studio. Ho due app per Android che usano Facebook sdk con la stessa applicazione di Facebook per accedere e condividere le foto. Con la nuova API, è necessario dichiarare all'interno di manifestare questa:Studio Android: INSTALL_FAILED_CONFLICTING_PROVIDER facebook sdk

<provider android:authorities="com.facebook.app.FacebookContentProvider[app_id]" 
     android:name="com.facebook.FacebookContentProvider" 
     android:exported="true"/> 

Ora, se una delle app che è già installato sul dispositivo e cerco di installare il secondo, ottengo questo errore su Android Studio:

INSTALL_FAILED_CONFLICTING_PROVIDER 

È necessario un problema con il provider di Facebook, ovvero l'unico elemento all'interno della mia app. Quindi, in questo modo le mie due app non possono essere installate contemporaneamente sullo stesso dispositivo? Mi piacerebbe se ci fosse un modo per utilizzare lo stesso provider ed evitare quell'errore.

+1

Si dovrebbe avere per creare un'altra applicazione nella console per gli sviluppatori di Facebook e assegnare l'id di un'altra app alla tua app e integrarla con la tua voce del provider di manifest e sei in grado di farlo. –

+2

Due app appartengono alla stessa app di Facebook. Non è possibile creare due applicazioni distinte – giozh

+0

Hai mai trovato una soluzione alternativa per questo? Stavo pensando se fosse possibile disabilitare il 'ContentProvider' nelle versioni' Debug'. Sto ancora ricercando il problema. Ovviamente questo disabiliterà le funzionalità di condivisione per quella versione. –

risposta

4

Quindi, in questo modo le mie due app non possono essere installate contemporaneamente sullo stesso dispositivo?

Corretto.

Vorrei se esiste un modo per utilizzare lo stesso provider ed evitare tale errore.

Quanto segue non ha nulla a che fare con l'SDK di Facebook, ma riguarda solo Android e i suoi limiti. L'SDK di Facebook può imporre limiti nuovi ed eccitanti.

In teoria, si potrebbe dire che l'App A ha il <provider> e l'App B utilizza il provider dall'app A. Ciò implica che l'App B non può essere utilizzata da sola. Quando l'utente esegue l'app, è necessario verificare se l'app A è installata e obbligare l'utente a installarla per poter utilizzare App B. Ciò potrebbe causare una certa angoscia per l'utente. Se vuoi che sia l'App A che l'App B siano utilizzabili singolarmente, va bene, ma entrambi dovranno avere lo <provider> e quindi non potranno essere entrambi installati contemporaneamente.

Idealmente, si dovrebbe risolvere questo problema avendo entrambi gli elementi <provider> disabilitati (android:enabled="false") all'inizio. Quindi, chiunque si diriga per primo si eleggerebbe per essere quello che offre il provider per quel dispositivo, a quel punto esso abiliterebbe il provider. Purtroppo, a causa di an Android bug/limitation, questo non risolverà il problema, in quanto non sarà in grado di avere entrambi installati allo stesso tempo comunque.

Sono tendenzialmente d'accordo con il commento di Rajan Bhavsar. O è necessario disporre di uno Android applicazione per il tuo uno app Facebook ID, o hai bisogno di due ID applicazione di Facebook per i tuoi due applicazioni Android.

+0

È una situazione particolare, in cui due app sono per due tipi diversi di utenti fisici (una app esegue un sottoinsieme di operazioni dell'altro), ma non accade mai che un utente possa avere entrambe le applicazioni installate contemporaneamente sullo stesso dispositivo. È solo fastidioso durante la fase di test sul dispositivo fisico (ho bisogno di disinstallare una app se provassi l'altra). – giozh

+0

@giozh: Allora il tuo attuale approccio è probabilmente la tua migliore risposta. Potresti considerare di scrivere tu stesso un'attività Gradle che disinstalla l'altra app e installa quella con cui stai cercando di lavorare, che puoi invocare per passare rapidamente da una all'altra. Oppure, utilizzare due dispositivi fisici. E, per quel che ne so, Facebook ha qualche altra soluzione per questo problema che è specifica per il modo in cui richiedono che vengano definite le "autorità". – CommonsWare

+0

ottima risposta .... funziona – sonida

-1

Quindi è possibile modificare il nome del provider da una delle app. Usa nome applicazione Inst di App_id.

+0

L'ID applicazione è l'ID fornito dalla console per gli sviluppatori di Facebook e deve corrispondere all'ID indicato. –

16

Questa è una vecchia domanda che conosco, ma non ho trovato una risposta chiara a ciò che ho potuto trovare. Ho pensato di pubblicare come l'ho fatto.

Non è possibile avere due app diverse (o la stessa app utilizzando due diversi ID applicazione) utilizzando lo stesso ID app Facebook. Questo rompe la roba di ContentProvider. È necessario creare un'applicazione di test sotto l'app principale nell'area degli sviluppatori di Facebook.Quindi prendi il nuovo ID app da lì e tienilo a portata di mano.

Successivamente, nel file build.gradle, aggiungere (o aggiungere) la seguente voce al blocco defaultConfig.

manifestPlaceholders = [ facebook_app_id:"" ] 

Poi, nel tuo config di debug aggiungere:

manifestPlaceholders = [ facebook_app_id:"<the_debug_app_id_you_kept_handy>"] 

Poi nella configurazione di rilascio aggiungere:

manifestPlaceholders = [ facebook_app_id:"<the_original_app_id_you_had>" ] 

Ora, cambiare l'AndroidManifest.xml. Cambio:

<provider android:authorities="com.facebook.app.FacebookContentProvider<original_app_id>" 

a:

<provider android:authorities="com.facebook.app.FacebookContentProvider${facebook_app_id}" 

e, cambiamento:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="<original_app_id>"/> 

a:

<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="${facebook_app_id}"/> 

Che dovrebbe farlo. Quello che hai fatto è aggiungere un segnaposto al manifest. Essenzialmente è una variabile, quindi puoi impostare la build del gradle per popolare il suo valore con cose diverse in base al tipo di build o al sapore.

+0

Grazie per avermi aiutato a risolvere il mio problema di un'app con diversi applicationId – Dokuzov

+0

Grazie per la soluzione. Hai risparmiato un bel po 'di tempo. –

Problemi correlati