Android Google haritaları java.lang.NoClassDefFoundError: Hata çözümü: Lorg / apache / http / ProtocolVersion


208

Google Haritalar Android SDK 11.6.2'yi (Ayrıca 15.0.1'i denedim) kullanıyorum, ancak harita gösterilmeden önce çökmeyi takip ediyorum. Manifest'te zaten kontrol edilen API anahtarı, kullanılabilir, ancak yine de bu sorun oluşuyor. 28 gibi targetSDk sürümü yaşıyorum. Bu soruna neden olur.

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) 

Zaten defaultConfig doğru multiDexEnabled var
Ramprasad

6
Bu sorun Android P'de meydana geliyor ... Android 5'de iyi çalışıyor
Ramprasad

1
Bunu da
ham

Bu hatayı da aldım. Android Studio ve emülatörünü kullanma.
frankliuao

15
Bu hatayı API seviye 28'de (Android 9.0) gören Google Haritalar dokümanları artık gerekli bildirim girişini açıklıyor .
Bob Snyder

Yanıtlar:


496

Bunu Manifest <application>etiketine koyun :

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

Daha fazla bilgi: https://issuetracker.google.com/issues/79478779


9
Bu sorunu çözdü. Yine de bunun neden gerekli olduğunu tam olarak anlama. MapsActivity eskiden düzenli görünüyordu ..
frankliuao

8
Android 9.0 zaten yayınlandı ve Google, harita kütüphanesini hala düzeltmedi, ikisi de bu kütüphaneyi gerektirdiğini belgeledi. Çok zayıf geliştirici desteği.
headsvk

41
@headsvk Google bunu belgeledi, bkz: developers.google.com/maps/documentation/android-sdk/…
jambon

Yine de, Apache HTTP istemci desteği Android 6'dan beri kaldırıldı: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

Bu java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;, AndroidX'e geçtikten sonra da düzeltildi (ve sonraki 65K yöntemleri artışı sınırladı)
Birisi

41

Bu, çökmenizi çözecektir. Manifest'te uygula

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


<application/>

1
Ne işe android:usesCleartextTraffic="true"yarar? Diğer cevaplar bu çizgiden bahsetmiyor. Yani isteğe bağlı mı?
Timo Bähr

1
@ TimoBähr bu sorunun bir parçası değil. cevap jambon mentoned ne, Nicky'nin cevap bu satırı uygulama etiketleri içine eklemeniz gerektiğini göstermek için daha açık hale getirir.
batmaci

@ TimoBähr android:usesCleartextTraffic="true"daha sonra alacağınız bir konudur, güvenlik amaçlıdır.
Lester L.

@ Lester.L Bu beyan eğer açık android:usesCleartextTraffic=”true”metin http linkleri ile iletişim sağlar - bu status quo. Anladığım kadarıyla sadece android:usesCleartextTraffic=”false”uygulamayı daha "güvenli" yapacak. Yanılıyorsam lütfen beni düzeltin.
Timo Bähr

1
Kaldırdım. Onunla ilgisi yoktur ve kendi kendine cevap verir ve birisi kopyalayıp yapıştırırsa bazı güvenlik ihlallerine neden olmalıdır.
JerabekJakub

16

Aşağıdaki çözümlerden birini yapın:

1- Play-services-maps kütüphanesini en son sürüme güncelleyin:

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

2- Ya da <application>elemanına aşağıdaki beyanı ekleyiniz AndroidManifest.xml.

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

Her iki çözüm de bu google doc tarafından desteklenmektedir: developers.google.com/maps/documentation/android-sdk/…
Andy

9

Uygulamanız API 28 seviyesini (Android 9.0) veya üstünü hedefliyorsa <application>, AndroidManifest.xml öğesi içine aşağıdaki bildirimi eklemeniz gerekir .

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


0

Bu, Android 8.0 veya üst sürümlerinde olursa, bu satırı manifest uygulama etiketinize koyun

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

0

Set tis:

multiDexEnabled true

Bunun gibi:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Manifest dosyasına izinler ekleme

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

ve kısmen bu kod satırını

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

Aynı sorunu yaşadım ve bu sorunu giderdi.


0

İşte çözüm

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

Bu satırı Menifest.xml içindeki <application>etiketinize ekleme

daha fazla bilgi için


0

xml dosyası yarat 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>

AndroidManifest.xml dosyasına 2 etiket etiketi ekleyin

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

Ayrıca, uygulama oluşturma sınıfınıza useLibrary 'org.apache.http.legacy' ekleyin

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.