Android Google отображает java.lang.NoClassDefFoundError: Ошибка разрешения: Lorg / apache / http / ProtocolVersion

Я использую 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@[email protected] (100408-196123505):3)
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):4)
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):51)
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):11)
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):16)
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (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@[email protected] (100408-196123505):25)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at el.b(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):3) 
        at ek.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):4) 
        at em.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):51) 
        at com.google.maps.api.android.lib6.drd.ap.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):11) 
        at dw.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):16) 
        at dw.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (100408-196123505):61) 

В defaultConfig уже есть multiDexEnabled true

Ramprasad 10.06.2018 12:39

Эта проблема возникает в Android P ... хорошо работает на Android 5

Ramprasad 10.06.2018 13:08

Получил тоже такое бывает только на Android P beta 2.

ham 11.06.2018 10:58

Я тоже получил эту ошибку. Использование Android Studio и ее эмулятора.

frankliuao 22.07.2018 17:42

Те, кто видит эту ошибку на уровне API 28 (Android 9.0), документы Google Maps теперь описывают необходимая запись в манифесте.

Bob Snyder 15.08.2018 22:16

Как исправить то же самое с Nativescript? stackoverflow.com/questions/53324898/…

dev dev 15.11.2018 18:28

Я использую это на галактике Samsung s8 и s9 и все еще не работаю. любое другое решение?

Pxaml 03.04.2019 22:55
218
7
67 240
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Поместите это в тег манифеста <application>:

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

Больше информации: https://issuetracker.google.com/issues/79478779

Это решило проблему. Но не совсем понимаю, зачем это нужно. MapsActivity, который я использовал, казался обычным.

frankliuao 22.07.2018 17:46

Android 9.0 уже выпущен, и Google до сих пор не исправил библиотеку карт и не задокументировал, что она требует наличия этой библиотеки. Очень плохая поддержка разработчиков.

headsvk 01.10.2018 13:18

@headsvk Google задокументировал это, см .: developers.google.com/maps/documentation/android-sdk/…

ham 01.10.2018 13:25

Тем не менее, поддержка HTTP-клиента Apache была удалена с Android 6: https://developer.android.com/about/versions/marshmallow/and‌ roid-6.0-changes # beh‌ avior-apache-http-cl‌ ient

wamfous 09.01.2019 09:26

Это также исправило java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair; после того, как я переключился на AndroidX (и последующее увеличение предела методов 65K)

Someone Somewhere 09.05.2019 18:29

снижает ли устаревший режим производительность карты? с несколькими маркерами и кластерами?

Daniel Givoni 03.07.2019 15:45

Это также сработало и при реагировании на native, когда приложение вылетало при загрузке карт.

Thomas Uchiha 30.07.2019 00:03

Это полностью решило проблему для меня в версии Android P.

Alvaro Lazaro 14.02.2020 07:38

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

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


<application/>

Для чего нужен android:usesCleartextTraffic = "true"? В других ответах эта строка не упоминается. Так необязательно?

Timo Bähr 18.12.2018 19:57

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

Emil 20.12.2018 16:51

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

Lester L. 04.01.2019 08:41

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

Timo Bähr 04.01.2019 09:01

Я удалил это. Он не имеет ничего общего с самим собой и не отвечает сам по себе и, возможно, может вызвать некоторое нарушение безопасности, если кто-то скопирует и вставит его.

JerabekJakub 14.01.2019 07:38

Хорошо, но когда я нажимаю кнопку возврата, это все еще отображается в журнале -> 2019-06-11 23: 11: 26.279 8522-8522 / com.example.myweatherapp E / SchedPolicy: set_timerslack_ns write failed: Operation not allowed

Sanjit Prasad 11.06.2019 19:42

Выполните одно из следующих решений:

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 24.06.2019 15:45

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

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

создать файл 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' в Gradle сборки вашего приложения.

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }

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

https://developer.android.com/about/versions/pie/android-9.0-changes-28https://developer.android.com/about/versions/pie/android-9.0-changes-28

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

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

Установите tis:

multiDexEnabled true

Как это:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

Добавить разрешения в файле манифеста

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

У меня была такая же проблема, и она была исправлена.

Вот решение

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

Добавление этой строки в ваш Menifest.xml внутри тега <application>

для получения дополнительной информации

Другие вопросы по теме