Bản đồ Android của Google java.lang.NoClassDefFoundError: Không thể giải quyết: Lorg / apache / http / ProtocolVersion


208

Tôi đang sử dụng Google maps Android SDK 11.6.2 (Cũng đã thử 15.0.1), nhưng tôi gặp sự cố sau khi hiển thị bản đồ. Đã kiểm tra khóa API trong tệp kê khai, nó có sẵn, nhưng vẫn xảy ra sự cố này. Tôi đang có phiên bản targetSDk là 28. Nó có gây ra sự cố này không.

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) 

Đã có multiDexEnables true trong defaultConfig
Ramprasad

6
Sự cố này xảy ra trong Android P ... hoạt động tốt trên Android 5
Ramprasad

1
Cũng có điều này, nó chỉ xảy ra trên Android P beta 2.
ham

Tôi cũng nhận được lỗi này. Sử dụng Android Studio và trình giả lập của nó.
frankliuao

15
Những người nhìn thấy lỗi này trên API cấp 28 (Android 9.0), tài liệu Google Maps hiện mô tả mục nhập bảng kê khai bắt buộc .
Bob Snyder

Câu trả lời:


494

Đặt cái này vào <application>thẻ Manifest :

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

Thông tin thêm: https://issuetracker.google.com/issues/79478779


9
Điều này đã giải quyết vấn đề. Mặc dù vậy, không hiểu tại sao điều này là bắt buộc. Bản đồ Hoạt động tôi sử dụng dường như là tất cả đều đặn ..
frankliuao 22/07/18

8
Android 9.0 đã được phát hành và Google vẫn chưa sửa thư viện bản đồ, không có tài liệu nào yêu cầu thư viện này. Hỗ trợ dev rất kém.
Headsvk

41
@headsvk Google đã ghi lại tài liệu này, xem: developers.google.com/maps/documentation/android-sdk/
ham

Tuy nhiên, hỗ trợ ứng dụng khách HTTP HTTP đã bị xóa kể từ Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

Điều này cũng được khắc phục java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;sau khi tôi chuyển sang AndroidX (và tăng giới hạn phương thức 65K tiếp theo)
Ai đó ở đâu đó vào

41

Điều này sẽ giải quyết sự cố của bạn. Áp dụng điều này trong bảng kê khai

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


<application/>

1
Điều gì android:usesCleartextTraffic="true"tốt cho? Các câu trả lời khác không đề cập đến dòng này. Vì vậy, tùy chọn?
Timo Bähr

1
@ TimoBähr nó không phải là một phần của câu trả lời. câu trả lời là những gì ham đề cập, câu trả lời của Nick làm cho rõ ràng hơn để cho thấy rằng bạn nên chèn dòng này trong các thẻ ứng dụng.
batmaci

@ TimoBähr android:usesCleartextTraffic="true"vấn đề cũng là bạn sẽ nhận được sau này, nó là cho mục đích bảo mật.
Lester L.

@ Lester.L Nếu tôi tuyên bố android:usesCleartextTraffic=”true”điều này cho phép giao tiếp với các liên kết http rõ ràng - đó là hiện trạng. Vì vậy, theo tôi hiểu chỉ android:usesCleartextTraffic=”false”làm cho ứng dụng "an toàn" hơn. Vui long sửa cho tôi nêu tôi sai.
Timo Bähr

1
Tôi đã gỡ bỏ nó. Nó không có gì để làm và tự trả lời và có thể gây ra một số vi phạm bảo mật nếu ai đó sao chép và dán nó.
JerabekJakub

16

Thực hiện một trong các giải pháp sau:

1- Cập nhật thư viện play-services-maps lên phiên bản mới nhất:

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

2- Hoặc bao gồm khai báo sau trong <application>phần tử của AndroidManifest.xml.

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

Cả hai giải pháp đều được tài liệu google này hỗ trợ: developers.google.com/maps/documentation/android-sdk/
mẹo

9

Nếu ứng dụng của bạn đang nhắm mục tiêu API cấp 28 (Android 9.0) trở lên, bạn phải bao gồm khai báo sau trong <application>phần tử của AndroidManifest.xml.

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


0

Nếu điều này xảy ra trong Android 8.0 trở lên thì chỉ cần đặt dòng này vào thẻ ứng dụng bảng kê khai của bạn

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

0

Đặt tis:

multiDexEnabled true

Như thế này:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Thêm quyền trong tệp kê khai

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

và một phần đặt dòng mã này

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

Tôi đã có cùng một vấn đề và nó đã được sửa chữa bởi điều này.


0

Đây là giải pháp

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

Thêm dòng này vào <application>thẻ Menifest.xml của bạn trong thẻ

để biết thêm


0

tạo một tệp 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>

Và thêm 2 thẻ tag vào AndroidManifest.xml của bạn

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

Đồng thời thêm useL Library 'org.apache.http.legacy' trong lớp xây dựng ứng dụng của bạn

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.