Android Google지도 java.lang.NoClassDefFoundError : 실패한 해결 방법 : Lorg / apache / http / ProtocolVersion


208

Google지도 Android SDK 11.6.2 (15.0.1도 시도)를 사용하고 있지만지도가 표시되기 전에 충돌이 발생합니다. 매니페스트에서 API 키를 이미 확인했지만 사용 가능하지만 여전히이 문제가 발생합니다. 28로 targetSDk 버전이 있는데이 문제가 발생합니다.

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) 

defaultConfig에서 multiDexEnabled가 이미 true
Ramprasad

6
이 문제는 Android P에서 발생합니다. Android 5에서 잘 작동합니다.
Ramprasad

1
이것도 안드로이드 P 베타 2에서만 발생합니다.
ham

이 오류도 발생했습니다. Android Studio 및 해당 에뮬레이터 사용
frankliuao

15
API 수준 28 (Android 9.0)에서이 오류가 표시되는 사용자는 이제 Google지도 문서 에서 필수 매니페스트 항목을 설명 합니다 .
밥 스나이더

답변:


496

이것을 Manifest <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은 여전히지도 라이브러리를 수정하지 않았으며이 라이브러리가 필요하다고 문서화하지 않았습니다. 매우 열악한 개발자 지원.
headsvk

41
@headsvk Google에서이를 문서화했습니다. developers.google.com/maps/documentation/android-sdk/…
ham

또, 아파치 HTTP 클라이언트 지원은 안드로이드 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"나중에 얻을 수있는 문제입니다. 보안상의 목적입니다.
레스터 L.

@ Lester.L 내가 선언 android:usesCleartextTraffic=”true”하면 일반 텍스트 http 링크와 통신 할 수 있습니다. 내가 이해 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 문서에서 지원됩니다. 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" />


0

이것이 안드로이드 8.0 이상에서 발생하면 매니페스트 응용 프로그램 태그 에이 줄을 넣으십시오.

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

0

tis를 설정하십시오 :

multiDexEnabled true

이처럼 :

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

매니페스트 파일에 권한 추가

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

해결책은 다음과 같습니다.

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

<application>태그 내 Menifest.xml에이 줄 추가

더 많은 정보를 위해서


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>

그리고 AndroidManifest.xml에 태그 2 개를 추가하십시오

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

또한 앱 빌드 gradle에 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.