Android Google映射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) 

在defaultConfig中已经具有multiDexEnabled true
Ramprasad

6
此问题发生在Android P中...在Android 5上运行良好
Ramprasad

1
得到这个也一样,它只能发生在Android P的β2
火腿

我也遇到了这个错误。使用Android Studio及其模拟器。
frankliuao

15
那些在API级别28(Android 9.0)上看到此错误的人,现在Google Maps文档描述了所需的清单条目
鲍勃·斯奈德

Answers:


495

将其放在清单<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 '18 -10-1

41
@headsvk谷歌已经证明它,请参阅:developers.google.com/maps/documentation/android-sdk/...
火腿

尽管如此,Apache的HTTP客户端的支持已经由于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"好处?其他答案未提及此行。如此可选吗?
TimoBähr18年

1
@TimoBähr,这不是答案的一部分。答案是ham mentonton,Nicky的答案更清楚地表明您应该在应用程序标签中插入此行。
batmaci

@TimoBähr这个android:usesCleartextTraffic="true"问题也是您以后会遇到的,它是出于安全目的。
Lester L.19年

@ Lester.L如果我声明android:usesCleartextTraffic=”true”允许与明文http链接进行通信-这是现状。据我所知,只会android:usesCleartextTraffic=”false”使该应用程序更加“安全”。如果我错了,请纠正我。
TimoBähr19年

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

谷歌文档支持这两种解决方案: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

设置:

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

将此行添加到您的Menifest.xml中 <application>标记中

了解更多信息


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>

还要在您的应用程序构建包中添加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'
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.