Android谷歌地图java.lang.NoClassDefFoundError:失败的解决方案:Lorg / apache / http / ProtocolVersion

时间:2018-06-10 10:35:22

标签: android google-maps google-play-services

我正在使用Google地图Android SDK 11.6.2(也尝试过15.0.1),但是在地图显示之前我遇到了崩溃。已经检查过清单中的API密钥,它可用,但仍会出现此问题。我有targetSDk版本为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) 

10 个答案:

答案 0 :(得分:326)

将其放入Manifest <uses-library android:name="org.apache.http.legacy" android:required="false"/> 标记:

cacerts

更多信息: this

答案 1 :(得分:31)

这将解决您的崩溃问题。 在清单中应用

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


<application/>

答案 2 :(得分:12)

执行以下解决方案之一:

1-将play-services-maps库更新到最新版本:

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

2-或在<application>的{​​{1}}元素中包含以下声明。

AndroidManifest.xml

答案 3 :(得分:7)

如果您的应用定位到API级别28(Android 9.0)或更高版本,则必须在AndroidManifest.xml的<application>元素中包含以下声明。

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

答案 4 :(得分:1)

如果您的应用定位到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

答案 5 :(得分: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.merazinn"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }

答案 6 :(得分:0)

如果在Android 8.0或更高版本中发生这种情况,只需将此行放入清单应用程序标记中

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

答案 7 :(得分:0)

设置此内容:

multiDexEnabled true

像这样:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

答案 8 :(得分: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"/>`

我遇到了同样的问题,并且此问题已得到解决。

答案 9 :(得分:0)

这是解决方案

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

将此行添加到<application>标签内的Menifest.xml中

更多信息