Android Google maps java.lang.NoClassDefFoundError: risoluzione non riuscita di: Lorg / apache / http / ProtocolVersion


208

Sto usando Google Maps Android SDK 11.6.2 (provato anche 15.0.1), ma ottengo il seguente arresto anomalo prima della visualizzazione della mappa. Chiave API già selezionata in manifest, è disponibile, ma si verifica ancora questo problema. Sto avendo la versione targetSDk come 28.È causa questo problema.

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) 

Hai già multiDexEnabled true in defaultConfig
Ramprasad il

6
Questo problema si verifica in Android P ... funziona bene su Android 5
Ramprasad il

1
Anche questo, succede solo su Android P beta 2.
ham

Anch'io ho questo errore. Utilizzando Android Studio e il suo emulatore.
frankliuao,

15
Coloro che vedono questo errore al livello API 28 (Android 9.0), i documenti di Google Maps ora descrivono la voce manifest richiesta .
Bob Snyder,

Risposte:


496

Metti questo nel <application>tag Manifest :

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

Ulteriori informazioni: https://issuetracker.google.com/issues/79478779


9
Questo ha risolto il problema. Non capisco bene perché questo sia necessario, però. MapsActivity che ho usato sembrava essere tutto normale ..
frankliuao,

8
Android 9.0 è già stato rilasciato e Google non ha ancora corretto la libreria delle mappe, né documentato che richiede questa libreria. Supporto per sviluppatori molto scarso.
headsvk,

41
@headsvk Google lo ha documentato, vedi: developers.google.com/maps/documentation/android-sdk/…
ham

Tuttavia, il supporto client HTTP Apache è stato rimosso da Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

Ciò è stato risolto anche java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;dopo il passaggio ad AndroidX (e il successivo aumento del limite dei metodi 65K)
Someone Somewhere

41

Questo risolverà il tuo crash. Applicalo in manifest

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


<application/>

1
A cosa serve android:usesCleartextTraffic="true"? Altre risposte non menzionano questa riga. Così opzionale?
Timo Bähr,

1
@ TimoBähr non fa parte della risposta. la risposta è ciò che ha mentito, la risposta di Nicky rende più chiaro mostrare che è necessario inserire questa riga all'interno dei tag dell'applicazione.
Batmaci,

@ TimoBähr android:usesCleartextTraffic="true"è anche il problema che riceverai in seguito, è per motivi di sicurezza.
Lester L.

@ Lester.L Se dichiaro che android:usesCleartextTraffic=”true”ciò consente di comunicare con collegamenti http in chiaro - questo è lo status quo. Quindi, per quanto ho capito android:usesCleartextTraffic=”false”, renderebbe l'app più "sicura". Per favore correggimi se sbaglio.
Timo Bähr,

1
L'ho rimosso. Non ha nulla a che fare con e rispondere a se stesso e potrebbe eventualmente causare qualche violazione della sicurezza se qualcuno lo copia e incolla.
JerabekJakub,

16

Esegui una delle seguenti soluzioni:

1- Aggiorna la libreria di play-services-maps all'ultima versione:

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

2- Oppure includere la seguente dichiarazione all'interno <application>dell'elemento di AndroidManifest.xml.

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

Entrambe le soluzioni sono supportate da questo documento di google: developers.google.com/maps/documentation/android-sdk/…
Andy

9

Se la tua app è indirizzata al livello API 28 (Android 9.0) o superiore, devi includere la seguente dichiarazione all'interno <application>dell'elemento di AndroidManifest.xml.

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


0

Se ciò accade in Android 8.0 o versioni successive, inserisci questa riga nel tag dell'applicazione manifest

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

0

Imposta questo:

multiDexEnabled true

Come questo:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Aggiungi le autorizzazioni nel file manifest

`<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"/>`

e in parte metti questa riga di codice

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

Ho avuto lo stesso problema ed è stato risolto da questo.


0

Ecco la soluzione

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

Aggiungendo questa riga al tuo Menifest.xml all'interno <application> tag

per maggiori informazioni


0

crea un file 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>

E aggiungi 2 tag tag nel tuo 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>

Aggiungi anche useLibrary 'org.apache.http.legacy' nel tuo grado di compilazione dell'app

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.