Android Mapy Google java.lang.NoClassDefFoundError: Niepowodzenie rozdzielczości: Lorg / apache / http / ProtocolVersion

208

Korzystam z Google Maps Android SDK 11.6.2 (Wypróbowałem także 15.0.1), ale dostaję następującą awarię przed pokazaniem mapy. Już sprawdzony klucz API w manifeście, jest dostępny, ale nadal występuje ten problem. Mam wersję targetSDk jako 28. Czy to powoduje ten problem.

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@[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) 
Ramprasad
źródło
Już masz multiDexEnabled true w defaultConfig
Ramprasad
6
Ten problem występuje w Androidzie P ... działa dobrze na Androidzie 5
Ramprasad
1
Mam to również, dzieje się to tylko na Androidzie P beta 2.
szynka
Mam też ten błąd. Korzystanie z Android Studio i jego emulatora.
frankliuao
15
Osoby widzące ten błąd na interfejsie API na poziomie 28 (Android 9.0), dokumenty z Map Google opisują teraz wymagany wpis manifestu .
Bob Snyder

Odpowiedzi:

496

Umieść to w <application>znaczniku Manifest :

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

Więcej informacji: https://issuetracker.google.com/issues/79478779

szynka
źródło
9
To rozwiązało problem. Nie do końca rozumiem, dlaczego jest to wymagane. MapsActivity, z którego korzystałem, wydawał się być normalny ...
frankliuao
8
Android 9.0 został już wydany, a Google nadal nie naprawił biblioteki map, ani nie udokumentował, że wymaga tej biblioteki. Bardzo słabe wsparcie deweloperów.
headsvk
41
@headsvk Google to udokumentowało, patrz: developers.google.com/maps/documentation/android-sdk/…
szynka
Mimo to obsługa klienta HTTP Apache została usunięta od Androida 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous
Zostało to również naprawione java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;po przejściu na system AndroidX (i kolejne zwiększenie limitu metod 65K)
Someone Somewhere
41

To rozwiąże twoją awarię. Zastosuj to w manifeście

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


<application/>
Nicky
źródło
1
Do czego służy android:usesCleartextTraffic="true"? Inne odpowiedzi nie wspominają o tej linii. Więc opcjonalnie?
Timo Bähr,
1
@ TimoBähr nie jest częścią odpowiedzi. odpowiedzią jest szynka, odpowiedź Nicky'ego wyraźnie pokazuje, że należy wstawić ten wiersz w znaczniki aplikacji.
batmaci,
@ TimoBähr android:usesCleartextTraffic="true"problemem jest to, że dostaniesz się później, to ze względów bezpieczeństwa.
Lester L.
@ Lester.L Jeśli zadeklaruję, android:usesCleartextTraffic=”true”pozwala to komunikować się za pomocą czystych linków http - to jest status quo. O ile tylko rozumiem android:usesCleartextTraffic=”false”, aplikacja byłaby „bezpieczniejsza”. Proszę popraw mnie jeżeli się mylę.
Timo Bähr,
1
Usunąłem to. Nie ma to nic wspólnego z samą odpowiedzią i może spowodować pewne naruszenie bezpieczeństwa, jeśli ktoś go skopiuje i wklei.
JerabekJakub
16

Wykonaj jedno z następujących rozwiązań:

1- Zaktualizuj bibliotekę Play-Services-Maps do najnowszej wersji:

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

2- Lub dołącz następującą deklarację do <application>elementu AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
źródło
Oba rozwiązania są obsługiwane przez ten dokument google: developers.google.com/maps/documentation/android-sdk/…
Andy
9

Jeśli Twoja aplikacja jest kierowana na interfejs API na poziomie 28 (Android 9.0) lub wyższy, musisz dołączyć następującą deklarację w <application>elemencie AndroidManifest.xml.

 <uses-library
       android:name="org.apache.http.legacy"
  android:required="false" />
Suman
źródło
0

Jeśli tak się stanie w Androidzie 8.0 lub nowszym, po prostu umieść ten wiersz w tagu manifestu aplikacji

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Abdul Basit Rishi
źródło
0

Ustaw tis:

multiDexEnabled true

Lubię to:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}
reza_khalafi
źródło
0

Dodaj uprawnienia w pliku manifestu

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

i częściowo wstaw ten wiersz kodu

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

Miałem ten sam problem i zostało to naprawione.

Mina Roger
źródło
0

Oto rozwiązanie

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

Dodanie tego wiersza do wewnętrznego <application>tagu Menifest.xml

po więcej informacji

umi
źródło
0

utwórz plik 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>

I dodaj tag 2 tagi w pliku 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>

Dodaj także useLibrary „org.apache.http.legacy” do stopnia kompilacji aplikacji

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Sudhir singh
źródło