Android Google maps java.lang.NoClassDefFoundError: Не удалось разрешить: Lorg / apache / http / ProtocolVersion


208

Я использую Google Maps 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) 

Уже есть multiDexEnabled true в 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>тег Manifest :

<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/…
ветчина

Тем не менее, поддержка 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 (и последующее увеличение лимита методов
Someone Somewhere

41

Это разрешит ваш сбой. Примените это в манифесте

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


<application/>

1
Для чего это android:usesCleartextTraffic="true"хорошо? Другие ответы не затрагивают эту строку. Так необязательно?
Тимо Бар

1
@ TimoBähr это не часть ответа. ответ - это то, что задумал, ответ Ники проясняет, что вы должны вставить эту строку в теги приложения.
Batmaci

@ TimoBähr также android:usesCleartextTraffic="true"является проблемой, которую вы получите позже, в целях безопасности.
Лестер Л.

@ Lester.L Если я заявляю, что android:usesCleartextTraffic=”true”это позволяет общаться с открытым текстом http ссылки - это статус-кво. Так что, насколько я понимаю, только android:usesCleartextTraffic=”false”сделает приложение более «безопасным». Пожалуйста, поправьте меня, если я ошибаюсь.
Тимо

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/…
Энди,

9

Если ваше приложение ориентировано на уровень API 28 (Android 9.0) или выше, вы должны включить следующее объявление в <application>элемент AndroidManifest.xml.

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


0

Если это происходит в Android 8.0 или выше, просто поместите эту строку в тег приложения манифеста

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

Добавление этой строки в ваш <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>

И добавьте 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'
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.