Android Google Maps java.lang.NoClassDefFoundError: Не вдалося вирішити: Lorg / apache / http / ProtocolVersion


208

Я використовую карти Google Android 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 beta 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/isissue/79478779


9
Це вирішило проблему. Не дуже розумію, чому це потрібно. MapsActivity, яку я використовував, здавалося, все регулярно ..
frankliuao

8
Android 9.0 вже випущений, і Google все ще не виправив бібліотеку карт, не підтвердивши документацію, що ця бібліотека вимагає. Дуже погана підтримка розробників.
headsvk

41
@headsvk Google це задокументував, дивіться: developers.google.com/maps/documentation/android-sdk/…
ham

Тим не менш, підтримка клієнта 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"добре? В інших відповідях цей рядок не згадується. Так необов’язково?
Тімо Бах

1
@ TimoBähr це не є частиною відповіді. відповідь - це те, що нагадало шинка, відповідь Нікі чіткіше показує, що слід вставити цей рядок у теги додатків.
batmaci

@ TimoBähr android:usesCleartextTraffic="true"питання також у тому, що ви отримаєте згодом, це в цілях безпеки.
Лестер Л.

@ Lester.L Якщо я заявляю, android:usesCleartextTraffic=”true”це дозволяє спілкуватися з http-посиланнями ясного тексту - це статус-кво. Тож, наскільки я розумію, android:usesCleartextTraffic=”false”це зробить додаток більш "захищеним". Будь ласка, виправте мене, якщо я помиляюся.
Timo

1
Я її зняв. Це не має нічого спільного і відповідати самому собі, і, можливо, це може призвести до порушення безпеки, якщо хтось скопіює та вставить його.
JerabekJakub

16

Виконайте одне з наступних рішень:

1- Оновіть бібліотеку карток play-services-карт до останньої версії:

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

Додайте дозволи у файл Manifest

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