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


208

J'utilise Google maps Android SDK 11.6.2 (également essayé 15.0.1), mais je reçois le crash suivant avant que la carte ne s'affiche. Clé API déjà vérifiée dans le manifeste, elle est disponible, mais ce problème persiste. J'ai la version targetSDk en tant que 28.Est-ce que cela provoque 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) 

Vous avez déjà multiDexEnabled true dans defaultConfig
Ramprasad

6
Ce problème se produit dans Android P ... fonctionne bien sur Android 5
Ramprasad

1
J'ai aussi ça, ça n'arrive que sur Android P beta 2.
ham

J'ai aussi eu cette erreur. Utilisation d'Android Studio et de son émulateur.
frankliuao

15
Ceux qui voient cette erreur au niveau de l'API 28 (Android 9.0), les documents Google Maps décrivent maintenant l'entrée de manifeste requise .
Bob Snyder

Réponses:


496

Mettez ceci dans la <application>balise Manifest :

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

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


9
Cela a résolu le problème. Je ne comprends pas très bien pourquoi cela est nécessaire. MapsActivity que j'utilisais semblait être tout à fait régulière.
frankliuao

8
Android 9.0 est déjà sorti et Google n'a toujours pas corrigé la bibliothèque de cartes, ni documenté qu'il nécessite cette bibliothèque. Support de développement très médiocre.
headsvk

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

Néanmoins, la prise en charge du client HTTP Apache a été supprimée depuis Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

Cela a également été corrigé java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;après que je suis passé à AndroidX (et l'augmentation de la limite de méthodes de 65K qui a suivi)
Someone Somewhere

41

Cela résoudra votre plantage. Appliquer ceci dans le manifeste

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


<application/>

1
À quoi ça sert android:usesCleartextTraffic="true"? Les autres réponses ne mentionnent pas cette ligne. Si optionnel?
Timo Bähr

1
@ TimoBähr cela ne fait pas partie de la réponse. La réponse est ce que le jambon a mentonné, la réponse de Nicky montre plus clairement que vous devez insérer cette ligne dans les balises d'application.
batmaci

@ TimoBähr android:usesCleartextTraffic="true"c'est aussi le problème que vous obtiendrez plus tard, c'est pour des raisons de sécurité.
Lester L.

@ Lester.L Si je déclare android:usesCleartextTraffic=”true”cela permet de communiquer avec des liens http en texte clair - c'est le statu quo. Donc, autant que je sache, android:usesCleartextTraffic=”false”cela rendrait l'application plus "sécurisée". Corrigez-moi si j'ai tort, s'il-vous plait.
Timo Bähr

1
Je l'ai retiré. Cela n'a rien à voir avec lui-même et à répondre lui-même et devrait éventuellement provoquer une violation de la sécurité si quelqu'un le copie et le colle.
JerabekJakub

16

Effectuez l'une des solutions suivantes:

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

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

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

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

Les deux solutions sont prises en charge par ce document google: developers.google.com/maps/documentation/android-sdk/…
Andy

9

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

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


0

Si cela se produit dans Android 8.0 ou supérieur, mettez simplement cette ligne dans votre balise d'application manifeste

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

0

Réglez tis:

multiDexEnabled true

Comme ça:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Ajouter des autorisations dans le fichier manifeste

`<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION."/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.INTERNET"/>`

et mettre en partie cette ligne de code

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

J'ai eu le même problème et il a été résolu par cela.


0

Voici la solution

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

Ajout de cette ligne à votre Menifest.xml à l'intérieur <application> balise

pour plus d'informations


0

créer un fichier xml res / xml / network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
      <base-config cleartextTrafficPermitted="true">
       <trust-anchors>
        <certificates src="system" />
       </trust-anchors>
      </base-config>
    </network-security-config>

Et ajoutez 2 balises tag dans votre AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
 <manifest......>
  <application android:networkSecurityConfig="@xml/network_security_config">
   <activity..../> 
   ......
   ......
 <uses-library
        android:name="org.apache.http.legacy"
        android:required="false"/>
</application>

Ajoutez également useLibrary 'org.apache.http.legacy' dans votre gradle de génération d'application

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.