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@[email protected] (100408-196123505):25)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):3) 
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):4) 
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):51) 
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):11) 
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):16) 
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):61) 
Ramprasad
la source
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

jambon
la source
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/>
Nicky
la source
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" />
Darush
la source
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" />
Suman
la source
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"/>
Abdul Basit Rishi
la source
0

Réglez tis:

multiDexEnabled true

Comme ça:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}
reza_khalafi
la source
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.

Mina Roger
la source
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

umi
la source
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'
    }
Sudhir singh
la source