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.