Android Google memetakan java.lang.NoClassDefFoundError: Gagal resolusi: Lorg / apache / http / ProtocolVersion


208

Saya menggunakan peta Google Android SDK 11.6.2 (Juga mencoba 15.0.1), tetapi saya mengalami crash sebelum peta ditampilkan. Sudah memeriksa kunci API dalam manifes, itu tersedia, tetapi masalah ini tetap terjadi. Saya memiliki versi targetSDk sebagai 28. Apakah itu menyebabkan masalah ini.

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) 

Sudah memiliki multiDexEnabled true di defaultConfig
Ramprasad

6
Masalah ini terjadi di Android P ... berfungsi baik di Android 5
Ramprasad

1
Mendapat ini juga, itu hanya terjadi pada Android P beta 2.
ham

Saya mendapat kesalahan ini juga. Menggunakan Android Studio dan emulatornya.
frankliuao

15
Mereka yang melihat kesalahan ini pada API level 28 (Android 9.0), Google Maps docs sekarang menjelaskan entri manifes yang diperlukan .
Bob Snyder

Jawaban:


496

Letakkan ini di <application>tag Manifest :

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

Info lebih lanjut: https://issuetracker.google.com/issues/79478779


9
Ini memecahkan masalah. Namun, tidak terlalu mengerti mengapa ini diperlukan. MapsActivity yang saya gunakan sepertinya biasa-biasa saja ..
frankliuao

8
Android 9.0 sudah dirilis dan Google masih belum memperbaiki pustaka peta, tidak ada dokumentasi yang mengharuskan pustaka ini. Dukungan dev sangat buruk.
Headsvk

41
@headsvk Google telah mendokumentasikannya, lihat: developers.google.com/maps/documentation/android-sdk/…
ham


Ini juga diperbaiki java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;setelah saya beralih ke AndroidX (dan metode 65K membatasi peningkatan berikutnya)
Seseorang di suatu tempat

41

Ini akan menyelesaikan kerusakan Anda. Terapkan ini dalam manifes

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


<application/>

1
Apa android:usesCleartextTraffic="true"gunanya? Jawaban lain tidak menyebutkan baris ini. Jadi opsional?
Timo Bähr

1
@ TimoBähr itu bukan bagian dari jawabannya. Jawabannya adalah apa yang ditulis, jawaban Nicky membuatnya lebih jelas untuk menunjukkan bahwa Anda harus memasukkan baris ini ke dalam tag aplikasi.
batmaci

@ TimoBähr android:usesCleartextTraffic="true"masalah ini juga akan Anda dapatkan nanti, itu untuk tujuan keamanan.
Lester L.

@ Lester.L Jika saya menyatakan android:usesCleartextTraffic=”true”ini memungkinkan untuk berkomunikasi dengan tautan http cleartext - itu adalah status quo. Jadi sejauh yang saya mengerti hanya android:usesCleartextTraffic=”false”akan membuat aplikasi lebih "aman". Harap perbaiki saya jika saya salah.
Timo Bähr

1
Saya menghapusnya. Itu tidak ada hubungannya dengan dan menjawab sendiri dan mungkin dapat menyebabkan beberapa pelanggaran keamanan jika seseorang menyalin & menempelnya.
JerabekJakub

16

Lakukan salah satu solusi berikut:

1- Perbarui perpustakaan main-layanan-peta ke versi terbaru:

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

2- Atau sertakan deklarasi berikut dalam <application>elemen AndroidManifest.xml.

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

Kedua solusi didukung oleh google doc ini: developers.google.com/maps/documentation/android-sdk/…
Andy

9

Jika aplikasi Anda menargetkan API level 28 (Android 9.0) atau lebih tinggi, Anda harus menyertakan deklarasi berikut dalam <application>elemen AndroidManifest.xml.

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


0

Jika ini terjadi di Android 8.0 atau lebih baru maka cukup letakkan baris ini di tag aplikasi manifes Anda

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

0

Atur ini:

multiDexEnabled true

Seperti ini:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Tambahkan izin dalam 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"/>`

dan sebagian letakkan baris kode ini

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

Saya memiliki masalah yang sama dan diperbaiki dengan ini.


0

Ini solusinya

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

Menambahkan baris ini ke dalam Menifest.xml Anda di dalamnya <application> tag

untuk info lebih lanjut


0

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

Dan tambahkan 2 tag tag di AndroidManifest.xml Anda

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

Juga tambahkan useLibrary 'org.apache.http.legacy' di app build gradle Anda

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.