Plusieurs Applications utilisent le même fournisseur de contenu
Je suis en train d'élaborer un ensemble d'applications qui se distingue uniquement dans certaines labellisations (pensez aux différentes équipes de sport); cependant, je suis confronté à un problème là où je suis en utilisant une Bibliothèque de projet pour toutes les applications de marque et que vous voulez utiliser la même ContentProvider pour tous. Quand j'ai créé le ContentProvider, j'ai déclaré à l'AUTORITÉ comme une constante dans la classe (et par la dev exemple de code) et je suis en utilisant la même autorité dans chaque application spécifique dans les fichiers manifest. Il semble que je ne peux pas utiliser la même autorité dans l'ensemble de toutes les applications que j'ai cette erreur lorsque vous essayez d'installer une deuxième application (je installer une marque très bien, mais la deuxième install):
WARN/PackageManager(66): Can't install because provider name com.xxx.Provider (in package com.xxx) is already used by com.zzz
J'ai tenté plusieurs approches, mais aucun d'entre eux semblent fonctionner. Une idée que je n'ai pas encore fait, a été de créer une bibliothèque bocal et omettez simplement le Fournisseur de classe I ont et de le personnaliser à chaque application spécifique. Toutes les idées sur la façon de contourner ce problème sans avoir recours à cette?
- Vous pouvez essayer ma solution pour tâche similaire: stackoverflow.com/a/15964372/1220237
Vous devez vous connecter pour publier un commentaire.
ContentProviders sont identifiés par l'autorité, il se doit donc d'être unique. Je ne pense pas qu'il y a des trucs autour de cela.
En outre, il y a un bug dans la plate-forme Android qui empêche également d'utiliser le même nom de classe pour deux ContentProviders, même si elles ont une autorité différente et sont contenues dans des Apk. Voir le bug ici.
La solution que je conseille pour vous est de créer le résumé fournisseur de classe dans votre projet de bibliothèque, puis l'étendre avec un nom unique dans chacune des applications. Pour faire de cette pratique, vous aurez probablement besoin de créer un script pour générer/modifier le personne manifeste et contentprovider classes.
Espère que cette aide.
productFlavors
: developer.android.com/studio/build/build-variantsC'est une vieille question, mais je cherchais à faire quelque chose de similaire récemment. Avec l'accumulation de saveurs, de son vraiment simple maintenant.
Spécifier le BuildConfigField dans le gradle fichier:
Spécifier le fournisseur de l'autorité dans le manifeste:
Définir l'autorité pour le fournisseur à l'aide de la BuildConfigField Variable:
buildConfigField
en utilisantgetApplicationContext().getPackageName()
au moment de l'exécution à la place.BuildConfig.APPLICATION_ID
pour cela, je n'avais pas l'application de contexte disponibles dans le fournisseur de contenu.VOUS POUVEZ!
Comme dit dans ce post (qui explique comment Firebase initialise sa bibliothèque sans lui donner un contexte à partir de votre
Application#onCreate()
méthode), vous pouvez utiliser un espace réservé dans votre manifeste, comme ceci:Permet de dire que votre
paquet de bibliothèque est
com.android.app.library
forfait gratuit est
com.android.app.free
le forfait payé est
com.android.app.paid
Dans votre projet gratuit et payé projet, créer un fichier identique dans un paquet qui peut être n'importe quoi, mais doit être le même.
Exemple:
Créer un nouveau package dans votre version gratuite avec com.android.app.les données
Créer un fichier appelé Authority.java et à l'intérieur (Authority.java) mettre:
public class Authority {
}
Répétez cette opération pour la version payante, n'oubliez pas de garder le nom du paquet le même et le nom de classe.
Maintenant, dans votre contrat de fichier, dans votre bibliothèque, utilisez la commande suivante:
Maintenant, vous devriez être en mesure d'utiliser deux autorités.
De crédit: Ian Warick (code d'écrire)
Android - Avoir Fournisseur de l'autorité dans l'application du projet
Avertissement: je l'ai posté ici: Android double fournisseur de l'autorité de problème - vous ne savez Pas si le droit de répondre au même type de question avec la même réponse.
La façon suivante peut être utilisé pour emballer un ContentProvider au sein d'une bibliothèque et de définir le ContentProvider de l'autorité au moment de l'exécution, de sorte qu'il peut être inclus dans plusieurs projets sans ContentProvider Autorité de conflit. Cela fonctionne parce que le réel "autorité" vient de la AndroidManifest...pas le ContentProvider classe.
Commencer avec la base ContentProvider mise en œuvre..AUTORITÉ, CONTENT_URI et UriMatcher sont statiques, mais pas "final"....
Ensuite, remplacer le "attachInfo " méthode", de sorte que lorsque le ContentProvider est d'abord initialisé votre ContentProvider sera appelée avec le ProviderInfo qui est récupéré à partir de la AndroidManifest. Cela va se produire AVANT d'éventuelles requêtes sont faites, la plus probable lors de la Demande initiale de la classe de l'installation. L'utilisation de cette occasion pour réinitialiser l'AUTORITÉ, CONTENT_URI et UriMatcher à leurs "vrais" valeurs, tel que fourni par l'Application à l'aide de la ContentProvider bibliothèque.
Lorsque l'Application est démarrée, le ContentProvider est en fait instancié avec la classe d'Application, alors il aura accès à tous les package info. le ProviderInfo objet contient les informations fournies dans le AndroidManifest... La liste qui est inclus dans l'Application finale.
L'Autorité va maintenant être réécrite avec "com.foo.barapp.contenu" à la place de la valeur par défaut, et le UriMatcher sera mis à jour pour l'application de la valeur au lieu de la valeur par défaut. Les Classes qui s'appuient sur l ' "AUTORITÉ" est désormais accéder à la mise à jour de la valeur, et la UriMatcher permettra de bien distinguer les requêtes entrantes pour le com.foo.barapp.le contenu".
J'ai testé avec les deux à la fois un exemple d'application et une androidTest paquet simultanément et trouve qu'il fonctionne correctement.