Android Google maps java.lang.NoClassDefFoundError: การแก้ปัญหาล้มเหลว: Lorg / apache / http / ProtocolVersion


208

ฉันใช้ Google Maps Android SDK 11.6.2 (ลองอีก 15.0.1) แต่ฉันได้รับความผิดพลาดดังต่อไปนี้ก่อนที่แผนที่จะแสดง คีย์ API ที่ตรวจสอบแล้วในรายการจะพร้อมใช้งาน แต่ยังคงมีปัญหานี้อยู่ ฉันมีรุ่นเป้าหมาย SDK เป็น 28 มันเป็นสาเหตุของปัญหานี้

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) 

มี multiDexEnabled จริงแล้วใน defaultConfig
Ramprasad

6
ปัญหานี้เกิดขึ้นใน Android P ... ใช้งานได้ดีกับ Android 5
Ramprasad

1
ได้รับนี้ก็จะเกิดขึ้นเฉพาะใน Android P เบต้า 2
แฮม

ฉันได้รับข้อผิดพลาดนี้เช่นกัน ใช้ Android Studio และโปรแกรมจำลอง
frankliuao

15
ผู้ที่เห็นข้อผิดพลาดนี้ในระดับ API 28 (Android 9.0) ตอนนี้เอกสารของ Google Maps จะอธิบายรายการที่ต้องการ
บ็อบสไนเดอร์

คำตอบ:


496

ใส่สิ่งนี้ใน<application>แท็กรายการ:

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

ข้อมูลเพิ่มเติม: https://issuetracker.google.com/issues/79478779


9
วิธีนี้แก้ปัญหาได้ ไม่เข้าใจว่าทำไมถึงต้องมีสิ่งนี้ MapsActivity ที่ฉันใช้ดูเหมือนจะเป็นเรื่องปกติ ..
frankliuao

8
Android 9.0 เปิดตัวแล้วและ Google ยังไม่ได้แก้ไขไลบรารีของแผนที่และไม่ได้ระบุว่าต้องใช้ไลบรารีนี้ การสนับสนุน dev ที่แย่มาก
headsvk

41
@headsvk Google ได้ทำเอกสารแล้วโปรดดู: developers.google.com/maps/documentation/android-sdk/…
แฮม

ยังคงสนับสนุนลูกค้า HTTP Apache ได้ถูกลบออกตั้งแต่ Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

สิ่งนี้ได้รับการแก้ไขjava.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;หลังจากที่ฉันเปลี่ยนเป็น AndroidX (และวิธีการ 65K ที่ตามมาเพิ่มขึ้น จำกัด )
บางคนอยู่ที่ไหนสักแห่ง

41

วิธีนี้จะช่วยแก้ปัญหาความผิดพลาดของคุณได้ ใช้สิ่งนี้ในรายการ

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


<application/>

1
มีandroid:usesCleartextTraffic="true"ผลดีกับอะไร? คำตอบอื่น ๆ ไม่ได้กล่าวถึงสายนี้ ไม่จำเป็นดังนั้น?
Timo Bähr

1
@ TimoBährมันไม่ได้เป็นส่วนหนึ่งของคำตอบ คำตอบคือสิ่งที่แฮมพูดถึงคำตอบของ Nicky ทำให้ชัดเจนว่าคุณควรแทรกบรรทัดนี้ในแท็กแอปพลิเคชัน
batmaci

@ TimoBähr android:usesCleartextTraffic="true"เป็นปัญหาที่คุณจะได้รับในภายหลังเพื่อความปลอดภัย
Lester L.

@ Lester.L หากฉันประกาศandroid:usesCleartextTraffic=”true”สิ่งนี้อนุญาตให้สื่อสารกับลิงก์ http cleartext - นั่นคือสถานะที่เป็นอยู่ ดังนั้นเท่าที่ฉันเข้าใจandroid:usesCleartextTraffic=”false”จะทำให้แอป "ปลอดภัย" ยิ่งขึ้น โปรดแก้ไขฉันหากฉันผิด
Timo Bähr

1
ฉันลบมัน มันไม่มีอะไรเกี่ยวข้องกับและตอบตัวเองและอาจทำให้เกิดการละเมิดความปลอดภัยหากมีคนคัดลอกและวาง
JerabekJakub

16

ทำหนึ่งในวิธีแก้ไขปัญหาต่อไปนี้:

1- อัปเดตห้องสมุด play-services-maps เป็นเวอร์ชั่นล่าสุด:

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

2- หรือรวมไปถึงการประกาศต่อไปนี้ภายในองค์ประกอบของ<application>AndroidManifest.xml

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

Google Doc นี้รองรับทั้งสองโซลูชัน: developers.google.com/maps/documentation/android-sdk/…
Andy

9

หากแอปของคุณกำหนดเป้าหมาย API ระดับ 28 (Android 9.0) หรือสูงกว่าคุณจะต้องรวมการประกาศต่อไปนี้ภายใน<application>องค์ประกอบของ AndroidManifest.xml

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

4

หากแอปของคุณกำหนดเป้าหมาย API ระดับ 28 (Android 9.0) หรือสูงกว่าคุณจะต้องรวมการประกาศต่อไปนี้ภายในองค์ประกอบของ AndroidManifest.xml ดูการเปลี่ยนแปลงพฤติกรรมของการกำหนดเป้าหมายแอป 28+ ในลิงก์ด้านล่าง

https://developer.android.com/about/versions/pie/android-9.0-changes-28 https://developer.android.com/about/versions/pie/android-9.0-changes-28


0

หากสิ่งนี้เกิดขึ้นใน Android 8.0 ขึ้นไปเพียงแค่วางบรรทัดนี้ในแท็กแอปพลิเคชันรายการของคุณ

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


0

เพิ่มการอนุญาตในไฟล์ 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"/>`

และส่วนหนึ่งใส่รหัสบรรทัดนี้

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

ฉันมีปัญหาเดียวกันและได้รับการแก้ไขโดยสิ่งนี้



0

สร้างไฟล์ 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>

และเพิ่มแท็ก 2 แท็กใน AndroidManifest.xml ของคุณ

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

นอกจากนี้ยังเพิ่ม useLibrary 'org.apache.http.legacy' ในการสร้างแอปของคุณ

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.