Android Google Maps java.lang.NoClassDefFoundError: Fehlerhafte Auflösung von: Lorg / apache / http / ProtocolVersion


208

Ich verwende Google Maps Android SDK 11.6.2 (auch 15.0.1 ausprobiert), erhalte jedoch folgenden Absturz, bevor die Karte angezeigt wird. Der bereits überprüfte API-Schlüssel im Manifest ist verfügbar, dieses Problem tritt jedoch weiterhin auf. Ich habe die targetSDk-Version als 28.Ist dies das Problem?

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) 

Habe bereits multiDexEnabled true in defaultConfig
— Ramprasad

6
Dieses Problem tritt in Android P auf ... funktioniert gut auf Android 5
— Ramprasad

1
Habe das auch, es passiert nur auf der Android P Beta 2.
— Ham

Ich habe auch diesen Fehler bekommen. Verwenden von Android Studio und seinem Emulator.
— Frankliuao

15
Diejenigen, die diesen Fehler auf API-Ebene 28 (Android 9.0) sehen, beschreiben jetzt in den Google Maps-Dokumenten den erforderlichen Manifesteintrag .
— Bob Snyder

Antworten:


494

Fügen Sie dies in das Manifest- <application>Tag ein:

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

Weitere Informationen: https://issuetracker.google.com/issues/79478779


9
Dies löste das Problem. Ich verstehe jedoch nicht ganz, warum dies erforderlich ist. MapsActivity, die ich benutzte, schien ganz normal zu sein ..
— frankliuao

8
Android 9.0 ist bereits veröffentlicht und Google hat die Kartenbibliothek noch nicht repariert und auch nicht dokumentiert, dass diese Bibliothek erforderlich ist. Sehr schlechte Entwicklerunterstützung.
— Headsvk

41
@headsvk Google hat es dokumentiert, siehe: developer.google.com/maps/documentation/android-sdk/…
— ham

Trotzdem wurde die Unterstützung für Apache HTTP-Clients seit Android 6 entfernt: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
— wamfous

Dies wurde auch behoben, java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;nachdem ich zu AndroidX gewechselt war (und die nachfolgenden 65K-Methoden das Limit erhöhten)
— Jemand irgendwo

41

Dadurch wird Ihr Absturz behoben. Wenden Sie dies im Manifest an

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


<application/>

1
Wofür ist android:usesCleartextTraffic="true"gut? Andere Antworten erwähnen diese Zeile nicht. Also optional?
— Timo Bähr

1
@ TimoBähr es ist nicht Teil der Antwort. Antwort ist das, was Ham erwähnt hat. Nickys Antwort macht es klarer zu zeigen, dass Sie diese Zeile in Anwendungs-Tags einfügen sollten.
— Batmaci

@ TimoBähr das android:usesCleartextTraffic="true"ist auch ein Problem, das Sie später bekommen werden, es ist aus Sicherheitsgründen.
— Lester L.

@ Lester.L Wenn ich erkläre, dass android:usesCleartextTraffic=”true”dies die Kommunikation mit Klartext-http-Links ermöglicht - das ist der Status Quo. Soweit ich weiß, android:usesCleartextTraffic=”false”würde nur die App "sicherer" machen. Bitte korrigieren Sie mich, wenn ich falsch liege.
— Timo Bähr

1
Ich habe es entfernt. Es hat nichts damit zu tun und antwortet von selbst und sollte möglicherweise eine Sicherheitsverletzung verursachen, wenn jemand es kopiert und einfügt.
— JerabekJakub

16

Führen Sie eine der folgenden Lösungen aus:

1- Aktualisieren Sie die Play-Services-Maps-Bibliothek auf die neueste Version:

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

2- Oder fügen Sie die folgende Erklärung in das <application>Element von ein AndroidManifest.xml.

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

Beide Lösungen werden von diesem Google-Dokument unterstützt: developer.google.com/maps/documentation/android-sdk/…
— Andy

9

Wenn Ihre App auf API-Level 28 (Android 9.0) oder höher <application>abzielt , müssen Sie die folgende Deklaration in das Element von AndroidManifest.xml aufnehmen.

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


0

Wenn dies in Android 8.0 oder höher geschieht, fügen Sie diese Zeile einfach in Ihr Manifest-Anwendungs-Tag ein

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

0

Stellen Sie Folgendes ein:

multiDexEnabled true

So was:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Fügen Sie Berechtigungen zur Manifest-Datei hinzu

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

und teilweise setzen Sie diese Codezeile

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

Ich hatte das gleiche Problem und es wurde dadurch behoben.


0

Hier ist die Lösung

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

Hinzufügen dieser Zeile zu Ihrem Menifest.xml- <application>Tag

Für mehr Information


0

Erstellen Sie eine XML-Datei 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>

Und fügen Sie 2 Tags in Ihre AndroidManifest.xml ein

<?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>

Fügen Sie außerdem useLibrary 'org.apache.http.legacy' in Ihren App Build Gradle ein

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.