230 votes

Android Google maps java.lang.NoClassDefFoundError : Échec de la résolution de : Lorg/apache/http/ProtocolVersion

J'utilise Google maps Android SDK 11.6.2 (j'ai aussi essayé 15.0.1), mais j'obtiens le crash suivant avant que la carte ne s'affiche. J'ai déjà vérifié la clé API dans le manifeste, elle est disponible, mais le problème persiste. J'ai la version 28 du SDK cible, est-ce que c'est la cause de ce problème ?

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/ProtocolVersion;
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):3)
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):4)
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):51)
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):11)
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):16)
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):61)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "org.apache.http.ProtocolVersion" on path: DexPathList[[zip file "/system/priv-app/PrebuiltGmsCorePi/app_chimera/m/MapsDynamite.apk"],nativeLibraryDirectories=[/data/user_de/0/com.google.android.gms/app_chimera/m/00000036/MapsDynamite.apk!/lib/armeabi-v7a, /data/user_de/0/com.google.android.gms/app_chimera/m/00000036/MapsDynamite.apk!/lib/armeabi, /system/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:126)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at ad.loadClass(:com.google.android.gms.dynamite_dynamiteloader@12848063@12.8.48 (100408-196123505):25)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):3) 
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):4) 
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):51) 
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):11) 
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):16) 
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@12848063@12.8.48 (100408-196123505):61)

0 votes

MultiDexEnabled true est déjà présent dans defaultConfig

6 votes

Ce problème survient dans Android P... fonctionne bien sur Android 5

1 votes

J'ai eu la même chose, ça arrive seulement sur Android P beta 2.

554voto

ham Points 4934

Mettez ceci dans le Manifeste <application> étiquette :

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Plus d'informations : https://issuetracker.google.com/issues/79478779

9 votes

Cela a permis de résoudre le problème. Je ne comprends cependant pas très bien pourquoi cela est nécessaire. MapsActivity que j'ai utilisé semblait être tout à fait régulier

8 votes

Android 9.0 est déjà sorti et Google n'a toujours pas corrigé la bibliothèque maps, ni documenté qu'il a besoin de cette bibliothèque. Très mauvais support de développement.

42 votes

@headsvk Google l'a documenté, voir : developers.google.com/maps/documentation/Android-sdk/

43voto

Nicky Points 613

Cela résoudra votre problème. Appliquez ceci dans le manifeste

 <application
             ...
             >
             ...
          <uses-library android:name="org.apache.http.legacy" 
           android:required="false"/>
             ...

<application/>

1 votes

Qu'est-ce que android:usesCleartextTraffic="true" bon pour ? Les autres réponses ne mentionnent pas cette ligne. Donc facultatif ?

1 votes

@TimoBähr cela ne fait pas partie de la réponse. La réponse est ce que Ham a mentionné, la réponse de Nicky est plus claire pour montrer que vous devez insérer cette ligne dans les balises d'application.

0 votes

@TimoBähr le android:usesCleartextTraffic="true" est également une question que vous obtiendrez plus tard, c'est à des fins de sécurité.

19voto

Darush Points 3150

Adoptez l'une des solutions suivantes :

1- Mettre à jour la bibliothèque play-services-maps avec la dernière version :

com.google.android.gms:play-services-maps:16.1.0

2- Soit inclure la déclaration suivante dans le <application> élément de AndroidManifest.xml .

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />

0 votes

Les deux solutions sont étayées par ce document Google : developers.google.com/maps/documentation/Android-sdk/

12voto

Suman Points 219

Si votre application vise le niveau 28 de l'API (Android 9.0) ou un niveau supérieur, vous devez inclure la déclaration suivante dans le fichier <application> de AndroidManifest.xml.

 <uses-library
       android:name="org.apache.http.legacy"
  android:required="false" />

5voto

creativecoder Points 307

Si votre application vise le niveau d'API 28 (Android 9.0) ou plus, vous devez inclure la déclaration suivante dans l'élément de AndroidManifest.xml. Voir les changements de comportement de l'application ciblant le niveau 28+ dans le lien ci-dessous.

https://developer.Android.com/about/versions/pie/Android-9.0-changes-28 https://developer.android.com/about/versions/pie/android-9.0-changes-28

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X