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@[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
quelle
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

Schinken
quelle
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/>
Nicky
quelle
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" />
Darush
quelle
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" />
Suman
quelle
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"/>
Abdul Basit Rishi
quelle
0

Stellen Sie Folgendes ein:

multiDexEnabled true

So was:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}
reza_khalafi
quelle
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.

Mina Roger
quelle
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

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