Impossible d'obtenir fournisseur de : ClassNotFoundException
J'ai MyContentProvider
dans mon application qui fonctionne très bien lorsque je développer et exécuter en mode de débogage.
<provider android:name=".MyContentProvider"
android:authorities="com.contactcities"
android:exported="false">
</provider>
Mais quand je l'exportation de l'application, le télécharger et l'exécuter, il se bloque instantanément :
10-10 18:24:37.682 E/AndroidRuntime(10428): FATAL EXCEPTION: main
10-10 18:24:37.682 E/AndroidRuntime(10428): java.lang.RuntimeException: Unable to get provider com.contactcities.MyContentProvider: java.lang.ClassNotFoundException: com.contactcities.MyContentProvider in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar:/data/app/com.contactcities-1.apk]
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installProvider(ActivityThread.java:4509)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.installContentProviders(ActivityThread.java:4281)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4237)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread.access$3000(ActivityThread.java:125)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2071)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Handler.dispatchMessage(Handler.java:99)
10-10 18:24:37.682 E/AndroidRuntime(10428): at android.os.Looper.loop(Looper.java:123)
Je peux le reproduire sur tous mes appareils, 2.2, 4.0, 4.1
J'ai lu à travers de nombreux fils aujourd'hui. Certains d'entre eux de le blâmer, de ProGuard pour cela.
J'ai essayé d'ajouter
-keep public class com.contactcities.MyContentProvider
mais avec pas de chance.
Quand j'ai désactiver proguard, en ne mettant pas proguard.config=proguard.cfg
dans mon project.properties
. Il donne toujours la même erreur de version. Le débogage est de nouveau bien.
Peut-être que ce n'est pas assez pour désactiver proguard comme ça?
Peut-être l'astuce est qu'il se réfère à maps.jar dans ce crash. Je ne sais pas pourquoi il fait ça
in loader dalvik.system.PathClassLoader[/system/framework/com.google.android.maps.jar
Des indices sera très appréciée
quel est le nom du package dans votre manifeste? quel est le paquet sur
MyContentProvider
?La référence à
maps.jar
n'a rien à faire avec elle. C'est juste le classpath que le chargeur de classe. Dans votre cas, le classpath contient l'maps.jar et de toute votre apk.package="com.contactcities" (le manifeste) com.contactcities.MyContentProvider (l'emplacement du fichier)
Voici ma part de certains idiot conseils. Avez-vous essayé de faire une installation propre de l'application? Avez-vous essayé de modifier les autorités de la "com".contactcities" à quelque chose de plus raisonnable?
OriginalL'auteur AndroidGecko | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
Argh, pensé, j'ai essayé, mais il semble que je n'ai pas.
Project
->clean
fait travaillerface à la paume
OriginalL'auteur AndroidGecko
J'avais la même erreur, de s'avère que j'ai eu la mauvaise
android:name
valeur de l'attribut pour mon fournisseur de balise dans AndroidManifest.xml:Alors vérifiez cette valeur est comme ci-dessus
.ProviderClass
ou quel que soit votre nom de classe (commençant par un point). Alors n'Projet > Nettoyer et il va fonctionner.android:authorities
doit pointer vers une classe?OriginalL'auteur tpbapp
Les autorités d'attribut doit correspondre au contenu de l'autorité, tandis que le nom de l'attribut doit correspondre à la classe nom de votre Fournisseur Personnalisé de classe.
Pour exemple:
OriginalL'auteur Richa
Peut-être que mon inexpérience aider quelqu'un d'autre avec ce bug. C'était tout à fait énigmatiques pour moi, mais comme tout dans les ordinateurs évident, une fois que vous savez.
J'ai suivi ce tutoriel, qui est dans l'ensemble très bon:
http://www.vogella.com/tutorials/AndroidSQLite/article.html
Dès le début, dit-il pour créer un package appelé "contentprovider" puis à une classe au sein de "MyTodoContentProvider". Maintenant, quiconque est familier avec Java-style conventions de nommage aurait vu que ce devait être par rapport à la paquet principal. Mais j'étais de nouveau à tout cela, j'ai donc créé sur le côté quelque part.
Tous les travers de la construction du code, tout s'était bien passé. Eclipse trouvé et compris ce package, et n'a montré aucune erreurs. Puis le crash et le cryptique "Impossible d'obtenir des" fournisseur de message. Le chemin d'accès dans le message d'erreur, je le comprends maintenant, était inexistante chemin où le code a été à la recherche pour la classe, a été si longtemps et contenait autant d'itérations de "contentprovider" il était difficile de voir à quoi il faisait allusion, ou ce qui est mal avec elle.
Je soupçonne que le problème était dans le fichier de manifeste, mais j'étais sûr que c'était dans "android:autorité". Qui était un peu un non-intuitive. La chaîne en cet élément dans le manifeste correspond à un membre du public que vous exposez dans votre fournisseur de classe. Ce membre est nommé "CONTENT_URI". Mais les deux ne correspondent pas exactement. Par exemple:
Cela se termine par:
(À noter que l'AUTORITÉ elle-même est un membre privé, pas disponible en externe.)
Le manifeste correspondant ligne serait:
C'est le milieu de la partie entre le régime de contenu"://" et le chemin d'accès de base.
Le problème était en fait dans le manifeste ligne:
J'ai eu une erreur classe nommée "MyTodoContentProvider" dans un package nommé "contentprovider", alors quel était le problème? Le problème était que le colis était dans le mauvais endroit. Il était censé être par rapport à la paquet principal. C'est ce que le point, d'abord dans le nom, signifie. Il devrait suivre la même syntaxe que la "android:nom de" lignes d'activités, dans leurs sections du manifeste.
Si vous trouvez cela utile, s'il vous plaît une. Une fois que vous résoudre ce problème, il est facile d'oublier combien énigmatique, elle l'était.
OriginalL'auteur Rick Shory
Vous pourriez avoir passé votre classe limite sur les anciennes versions de systèmes d'exploitation—avant d'Android 5.0 (API level 21) a remplacé l'indice DEX moteur d'exécution ART. Si vous êtes à droite sur le bord de la limite, vous pouvez passer à la compilation, mais ce message d'erreur lors du démarrage.
Essayez d'activer le multi-dex comme décrit dans l'Android Activer Multidex pour les Applications avec Plus de 64 ko Méthodes de la documentation.
OriginalL'auteur Jon Adams