Android Google Maps java.lang.NoClassDefFoundError: Resolución fallida de: Lorg / apache / http / ProtocolVersion

208

Estoy usando Google Maps Android SDK 11.6.2 (también probé 15.0.1), pero aparece el siguiente bloqueo antes de que se muestre el mapa. Ya se verificó la clave API en el manifiesto, está disponible, pero aún así ocurre este problema. Tengo una versión de targetSDk como 28.Es que causa este 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@[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
fuente
Ya tengo multiDexEnabled true en defaultConfig
Ramprasad
66
Este problema ocurre en Android P ... funciona bien en Android 5
Ramprasad
1
Conseguido esto también, que ocurre sólo en el Android beta 2. P
jamón
También recibí este error. Usando Android Studio y su emulador.
frankliuao
15
Los que ven este error en el nivel de API 28 (Android 9.0), los documentos de Google Maps ahora describen la entrada de manifiesto requerida .
Bob Snyder

Respuestas:

496

Ponga esto en la <application>etiqueta Manifiesto :

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

Más información: https://issuetracker.google.com/issues/79478779

jamón
fuente
9
Esto resolvió el problema. Sin embargo, no entiendo por qué se requiere esto. MapsActivity que utilicé parecía ser todo regular ..
frankliuao
8
Android 9.0 ya se lanzó y Google aún no ha reparado la biblioteca de mapas, ni documentado que requiera esta biblioteca. Muy mal soporte de desarrollo.
headsvk
41
@headsvk Google lo ha documentado, consulte: developers.google.com/maps/documentation/android-sdk/…
ham
Aún así, el soporte de cliente HTTP Apache se ha eliminado desde Android 6: https://developer.android.com/about/versions/marshmallow/android-6.0-changes#behavior-apache-http-client
wamfous
Esto también se solucionó java.lang.NoClassDefFoundError: Failed resolution of: Lorg/apache/http/message/BasicNameValuePair;después de cambiar a AndroidX (y el aumento del límite de métodos de 65K subsiguiente)
Someone Somewhere
41

Esto resolverá tu bloqueo. Aplicar esto en manifiesto

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


<application/>
Nicky
fuente
1
¿Para qué es android:usesCleartextTraffic="true"bueno? Otras respuestas no mencionan esta línea. ¿Tan opcional?
Timo Bähr
1
@ TimoBähr no es parte de la respuesta. La respuesta es lo que mencionó Ham, la respuesta de Nicky aclara que debes insertar esta línea dentro de las etiquetas de la aplicación.
batmaci
@ TimoBähr este android:usesCleartextTraffic="true"es el problema que recibirá más adelante, es por razones de seguridad.
Lester L.
@ Lester.L Si declaro que android:usesCleartextTraffic=”true”esto permite comunicarse con enlaces http de texto sin formato, eso es el status quo. Por lo que yo entiendo, solo android:usesCleartextTraffic=”false”haría que la aplicación sea más "segura". Por favor corrígeme si estoy equivocado.
Timo Bähr
1
Lo quité. No tiene nada que ver y responderse a sí mismo y posiblemente deba causar alguna violación de seguridad si alguien la copia y pega.
JerabekJakub
16

Realice una de las siguientes soluciones:

1- Actualiza la biblioteca de play-services-maps a la última versión:

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

2- O incluya la siguiente declaración dentro del <application>elemento de AndroidManifest.xml.

<uses-library
      android:name="org.apache.http.legacy"
      android:required="false" />
Darush
fuente
Ambas soluciones son compatibles con este documento de google: developers.google.com/maps/documentation/android-sdk/…
Andy
9

Si su aplicación está dirigida al nivel de API 28 (Android 9.0) o superior, debe incluir la siguiente declaración dentro del <application>elemento de AndroidManifest.xml.

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

Si esto sucede en Android 8.0 o superior, simplemente ponga esta línea en su etiqueta de aplicación de manifiesto

<uses-library android:name="org.apache.http.legacy" android:required="false"/>
Abdul Basit Rishi
fuente
0

Establecer tis:

multiDexEnabled true

Me gusta esto:

android {
    compileSdkVersion 28
    defaultConfig {

        multiDexEnabled true

    }
    buildTypes {
        release {

        }
    }
}
reza_khalafi
fuente
0

Agregar permisos en el archivo de manifiesto

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

y en parte pon esta línea de código

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

Tuve el mismo problema y esto fue solucionado.

Mina Roger
fuente
0

Aquí esta la solución

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

Agregar esta línea a su Menifest.xml dentro <application> etiqueta

para más información

umi
fuente
0

crear un archivo 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>

Y agregue 2 etiquetas en su 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>

Agregue también useLibrary 'org.apache.http.legacy' en su aplicación de construcción

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
fuente