Android Google maps java.lang.NoClassDefFoundError: falha na resolução de: Lorg / apache / http / ProtocolVersion


208

Estou usando o SDK do Android Maps 11.6.2 do Google Maps (também tentei 15.0.1), mas recebo a seguinte falha antes que o mapa seja exibido. A chave de API já marcada no manifesto, está disponível, mas ainda assim esse problema ocorre. Estou tendo a versão targetSDk como 28. Isso causa esse problema.

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) 

Já multiDexEnabled verdade em DefaultConfig
Ramprasad

6
Esse problema ocorre no Android P ... funciona bem no Android 5
Ramprasad 10/18

1
Tem isso também, isso acontece apenas no Android P beta 2.
presunto

Também recebi esse erro. Usando o Android Studio e seu emulador.
22718 frankliuao

15
Aqueles que veem esse erro no nível 28 da API (Android 9.0), os documentos do Google Maps agora descrevem a entrada de manifesto necessária .
Bob Snyder

Respostas:


496

Coloque isso na <application>tag Manifest :

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

Mais informações: https://issuetracker.google.com/issues/79478779


9
Isso resolveu o problema. Mas não entendo muito bem por que isso é necessário. O MapsActivity que eu costumava parecer normal ... #
frankliuao

8
O Android 9.0 já foi lançado e o Google ainda não corrigiu a biblioteca de mapas, nem documentou que exige essa biblioteca. Muito pobre suporte para desenvolvedor.
Headsvk 01/10/1918

41
@headsvk O Google documentou, veja: developers.google.com/maps/documentation/android-sdk/…
ham

Ainda assim, suporte ao cliente HTTP Apache foi removido desde Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous

Isso também foi corrigido java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;depois que mudei para o AndroidX (e os métodos subsequentes aumentam o limite de 65 mil)
Alguém em algum lugar

41

Isso resolverá sua falha. Aplique isso no manifesto

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


<application/>

1
Para que serve android:usesCleartextTraffic="true"? Outras respostas não mencionam esta linha. Tão opcional?
Timo Bähr

1
@ TimoBähr não faz parte da resposta. resposta é o que foi mencionado, a resposta de Nicky deixa mais claro que você deve inserir essa linha nas tags do aplicativo.
batmaci

@ TimoBähr a android:usesCleartextTraffic="true"questão também é que você receberá mais tarde, é por motivos de segurança.
Lester L.

@ Lester.L Se eu declarar, android:usesCleartextTraffic=”true”isso permite a comunicação com links http em texto não criptografado - isso é status quo. Pelo que entendi, apenas android:usesCleartextTraffic=”false”tornaria o aplicativo mais "seguro". Por favor me corrija se eu estiver errado.
Timo Bähr

1
Eu removi isso. Ele não tem nada a ver com e responde a si mesmo e deve causar alguma violação de segurança se alguém copiar e colar.
precisa saber é o seguinte

16

Siga uma das seguintes soluções:

1- Atualize a biblioteca play-services-maps para a versão mais recente:

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

2- Ou inclua a seguinte declaração no <application>elemento de AndroidManifest.xml.

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

Ambas as soluções são suportadas por este documento do google: developers.google.com/maps/documentation/android-sdk/…
Andy

9

Se seu aplicativo estiver direcionado para o nível 28 da API (Android 9.0) ou superior, inclua a seguinte declaração no <application>elemento AndroidManifest.xml.

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


0

Se isso acontecer no Android 8.0 ou superior, basta colocar esta linha na tag do aplicativo manifesto

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

0

Definir tis:

multiDexEnabled true

Como isso:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}

0

Adicionar permissões no arquivo de manifesto

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

e em parte colocar essa linha de código

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

Eu tive o mesmo problema e foi corrigido por isso.


0

Aqui está a solução

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

Adicionando esta linha à sua <application>tag Menifest.xml inside

para mais informações


0

crie um arquivo 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>

E adicione 2 tags no seu 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>

Adicione também useLibrary 'org.apache.http.legacy' em seu aplicativo

defaultConfig {
        applicationId "com.ascorb"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 6
        versionName "1.2"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        useLibrary 'org.apache.http.legacy'
    }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.