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

daging
sumber
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
Namun, dukungan klien HTTP Apache telah dihapus sejak Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous
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/>
Nicky
sumber
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" />
Darush
sumber
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" />
Suman
sumber
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"/>
Abdul Basit Rishi
sumber
0

Atur ini:

multiDexEnabled true

Seperti ini:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

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

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

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