¿Android Gradle Apache HttpClient no existe?

263

¿Estoy tratando de convertir un proyecto IntelliJ al sistema Gradle de Android Studio pero me encuentro con errores con Apache HttpClient? Me falta algo, los errores que obtengo son los siguientes:

Error:(10, 30) error: package org.apache.http.client does not exist
Error:(11, 30) error: package org.apache.http.client does not exist
Error:(12, 37) error: package org.apache.http.client.entity does not exist
Error:(13, 38) error: package org.apache.http.client.methods does not exist
Error:(14, 38) error: package org.apache.http.client.methods does not exist
Error:(15, 38) error: package org.apache.http.client.methods does not exist
Error:(16, 35) error: package org.apache.http.impl.client does not exist
Error:(134, 33) error: cannot find symbol class HttpUriRequest
Error:(164, 39) error: cannot find symbol class HttpUriRequest
Error:(106, 17) error: cannot find symbol class HttpGet
Error:(106, 39) error: cannot find symbol class HttpGet
Error:(117, 17) error: cannot find symbol class HttpPost
Error:(117, 40) error: cannot find symbol class HttpPost
Error:(125, 43) error: cannot find symbol class UrlEncodedFormEntity
Error:(135, 9) error: cannot find symbol class HttpClient
Error:(135, 33) error: cannot find symbol class DefaultHttpClient
Error:(155, 18) error: cannot find symbol class ClientProtocolException
Error:(165, 9) error: cannot find symbol class HttpClient
Error:(165, 33) error: cannot find symbol class DefaultHttpClient
Error:(185, 18) error: cannot find symbol class ClientProtocolException

Mi archivo build.gradle tiene las siguientes dependencias:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
    compile 'org.apache.httpcomponents:httpmime:4.2.6'
    compile files('libs/core.jar')
}

Parece que muchas personas están teniendo un problema similar, pero ni SO ni Google tienen una solución, por lo que espero que esta pregunta ayude a los futuros buscadores.

Apqu
fuente

Respuestas:

39

Le sugiero que reemplace el obsoleto apache HttpClient con el nuevo HttpURLConnection.

Esa es una solución más limpia, es bastante fácil de migrar y, en general, es mejor atenerse a los últimos cambios del SDK que intentar piratear / parchear / solucionar el problema: por lo general, lo lamentarás más tarde :)

Paso 1

HttpGet httpGet = new HttpGet(url);

se convierte en:

URL urlObj = new URL(url);

Paso 2

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpResponse response = httpClient.execute(httpGet, localContext);
InputStream is = response.getEntity().getContent();

se convierte en:

HttpURLConnection urlConnection = (HttpURLConnection) urlObj.openConnection();
InputStream is = urlConnection.getInputStream();

Paso 2 bis

int status = response.getStatusLine().getStatusCode();

se convierte en:

int status = urlConnection.getResponseCode();
Benjamin Piette
fuente
Hola @Benjamin, ¿cómo enviar URL con el método PUT?
Dharma Sai Seerapu
@TrickySolutions Lo siento, no tengo idea, todavía no he usado el método PUT.
Benjamin Piette
521

si está utilizando el SDK de destino como 23, agregue el siguiente código en su build.gradle

android{
    compileSdkVersion 23
    buildToolsVersion '23.0.1'
    useLibrary  'org.apache.http.legacy'
}

y cambia tu buildscript a

classpath 'com.android.tools.build:gradle:1.3.0' 

para más información sigue este enlace

Jinu
fuente
77
cambie su buildscript a classpath 'com.android.tools.build:gradle:1.3.0'
Jinu
3
Ya tenía 1.3.1. Todavía no puedo resolver las clases dentro de Android Studio:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa
2
android studio 1.4 beta 2
Jinu
2
¿Y qué pasa si desea utilizar la última versión de los componentes http apache?
russellhoff
2
Gracias Jinu, la actualización de Android Studio de 1.3 a la versión anterior es imprescindible. Lo tengo funcionando
mithil1501
94

Tuve este problema y luego encontré estas páginas: Aquí puede ver que la biblioteca apache está en desuso, pero no se ha eliminado, por lo que debería funcionar. No lo hace.

Ver .

Y aquí puedes ver cómo incluir la biblioteca apache en tu proyecto

Ver .

Resolví el problema agregando lo siguiente a mi archivo build.gradle como se recomienda en el segundo enlace.

android {
    useLibrary 'org.apache.http.legacy'
}

Sin embargo, esto solo funciona si está utilizando gradle 1.3.0-beta2 o superior, por lo que tendrá que agregar esto a las dependencias de buildscript si está en una versión inferior:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'

Espero que esto ayude.

Milos Savanovic
fuente
Para mí falló con: Error: Error de ejecución para la tarea ': xenoAmp: mergeDebugJavaResources'. > No se puede determinar la carpeta de expansión para L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE con carpetas L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \
packagedJarsJavaResources
@ssuukk Hola, ¿encontraste una solución para este error?
CeccoCQ
2
Desafortunadamente, la solución fue cambiar el objetivo a la API más alta actual, ¡y eso rompió MUCHAS cosas! Luego tuve que agregar "useLibrary", "classpath" PLUS legacy apache lib, como se describe en otra parte de esta pregunta. Y después de que se compiló nuevamente, decidí deshacerme del código de Apache por completo y reemplazarlo por URLConnection, lo que fue más fácil de lo que pensaba.
ssuukk
De acuerdo con ssuukk. Ninguna de estas respuestas funcionó para mí, así que terminé deshaciéndome de las bibliotecas de Apache también. Soy bastante nuevo en el desarrollo de Android, pero fue sencillo.
John81
Tuve el mismo problema y lo solucioné con useLibrary 'org.apache.http.legacy' como dijo Milos ... sin embargo, para @ssuukk con su problema, puede intentar agregar esto siempre: android {packagingOptions {excluir 'META-INF / LICENSE 'excluir' META-INF / DEPENDENCIAS 'excluir' META-INF / NOTICE 'excluir' META-INF / NOTICE.txt 'excluir' META-INF / MANIFEST '}}
Alexiscanny
53

Agregue esta biblioteca a build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Darshan Dhoriya
fuente
alguien puede explicar esto? ¿Por qué esto hace que funcione? ¿Por qué necesitamos agregar esta línea, además de agregar las dependencias?
Dan
2
@Dan es porque la biblioteca org.apache.http se eliminó con la versión 23.
eltiare
Para aclarar, esto no entra en la raíz build.gradle, sino dentro de la carpeta del módulo que está creando (es decir, "aplicación")
hamx0r
37

copia org.apache.http.legacy.jarque está en la Android/Sdk/platforms/android-23/optionalcarpeta aapp/libs

y también agregó esta línea al archivo app.gradle

compile files('libs/org.apache.http.legacy.jar')

Pero si está usando más bibliotecas jar, puede usar de esta manera

compile fileTree(dir: 'libs', include: ['*.jar'])
do01
fuente
2
En otro de mis proyectos, esta resultó ser la única respuesta que funcionó tan +1 y gracias.
Apqu
¿Por qué no es esta la respuesta?
dibble
1
Lo mismo para mi. Alguien debería aceptar esta respuesta en lugar de la aceptada ahora.
Ivan Fazaniuk
Este es el menor camino de resistencia, no estoy seguro de querer rebajar la gradle. Se compila bien para mí.
Ed Manners
¡Gracias! Esto funciona con el complemento gradle-experimental 0.6.0-alpha5. "useLibrary" no parece existir en el complemento experimental.
monkey0506
14

Básicamente, todo lo que necesita hacer es agregar:

useLibrary  'org.apache.http.legacy'

A tu build.gradlearchivo.

ATechPerson
fuente
9

Me encontré con el mismo problema. La respuesta de Daniel Nugent ayudó un poco (después de encontrar su consejo HttpResponse, pero HttpClientaún faltaba).

Entonces, esto es lo que me arregló:

  1. (si aún no lo ha hecho, recomiende las declaraciones de importación anteriores)
  2. visite http://hc.apache.org/downloads.cgi
  3. obtener el 4.5.1.zipde la sección binaria
  4. descomprimirlo y pegar httpcore-4.4.3y httpclient-4.5.1.jaren la project/libscarpeta
  5. haga clic derecho en el jar y elija Agregar como biblioteca .

Espero eso ayude.

Martin Pfeffer
fuente
9

Me encontré con problemas similares, es posible que pueda hacer que funcione con un método similar.

Primero, intente esto con su configuración actual, excluya httpclientde httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile ('org.apache.httpcomponents:httpmime:4.2.6'){
            exclude module: 'httpclient'
        }
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
} 

En mi caso, lo arreglé usando los siguientes frascos:

Luego, en build.gradle, excluyendo httpclientde httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile('org.apache.httpcomponents:httpmime:4.3.5') {
        exclude module: 'httpclient'
    }
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
}
Daniel Nugent
fuente
Gracias por su respuesta, me temo que tampoco funcionó para mí :(
Apqu
@tur eso es extraño, la segunda opción funcionó para mí. Asegúrese de que sus archivos jar antiguos se eliminen para la segunda opción.
Daniel Nugent
Lo que es libs/core.jarpara?
IgorGanapolsky
7

Respuesta perfecta de Jinu y Daniel

Agregando a esto resolví el problema usando esto, si su compileSdkVersion es 19 (EN MI CASO)

compile ('org.apache.httpcomponents:httpmime:4.3'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile ('org.apache.httpcomponents:httpcore:4.4.1'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile 'commons-io:commons-io:1.3.2'

de lo contrario, si su compileSdkVersion es 23, use

android {
useLibrary 'org.apache.http.legacy'
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    }
}
Sofía
fuente
5

Esto es lo que hice, y funciona para mí.

Paso 1: agregue esto en build.grade (módulo: aplicación)

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

Paso 2: sincroniza el proyecto y listo.

NOT_A_PROGRAMMER
fuente
¿Alguna razón para votar abajo?
NOT_A_PROGRAMMER
no se pudo resolver con el error "No se pudo resolver: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2". Estoy usando gradle experimental 0.6.0-beta. puedes resolverlo?
RoFF
1

La versión del cliente HTTP Apache que se proporcionaba en el stock de Android era muy, muy antigua .

Google Android 1.0 se lanzó con una instantánea anterior a BETA de Apache HttpClient. Para coincidir con la primera versión de Android, las API de Apache HttpClient 4.0 tuvieron que congelarse prematuramente, mientras que muchas de las interfaces y estructuras internas todavía no estaban completamente resueltas. A medida que Apache HttpClient 4.0 estaba madurando, el proyecto esperaba que Google incorporara las últimas mejoras de código en su árbol de códigos. Lamentablemente no sucedió.

Si bien puede seguir usando la antigua biblioteca obsoleta a través de la useLibrary 'org.apache.http.legacy'solución alternativa (sugerida por @ Jinu y otros), realmente necesita morder la viñeta y actualizar a otra cosa, por ejemplo, el Android nativo HttpUrlConnection, o si eso no satisface sus necesidades, puede usar la biblioteca OkHttp , que es en lo que HttpUrlConnectionse basa internamente de todos modos.

OkHttp en realidad tiene una capa de compatibilidad que usa la misma API que el cliente Apache, aunque no implementan todas las mismas características, por lo que su kilometraje puede variar.

Si bien es posible importar una versión más nueva del cliente Apache (como lo sugiere @MartinPfeffer), es probable que la mayoría de las clases y métodos que estaba utilizando hayan quedado en desuso, y existe un riesgo bastante grande de que la actualización introduzca errores en su código (por ejemplo, encontré algunas conexiones que anteriormente funcionaban desde atrás de un proxy ya no funcionaban), por lo que esta no es una gran solución.

Tim Rae
fuente
1

Después de pasar días sobre el tema, finalmente pude resolverlo. Desafortunadamente lo necesitamos si queremos usar archivos de expansión. La solución ha sido proporcionada por algunas personas aquí, pero para mí las respuestas no incluían algunos detalles menores que podrían haberme ahorrado mucho tiempo. Aquí está la secuencia de eventos para principiantes como yo para ahorrar su valioso tiempo.

Primero importé la carpeta "biblioteca" de D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing al proyecto yendo a Archivo, Nuevo, Módulo de importación y navegando a la carpeta "biblioteca". Si abre el Administrador de SDK y hace clic en "Iniciar Administrador de SDK independiente" en la parte inferior de la pantalla emergente, puede pasar el puntero sobre la carpeta "Extras" en la parte inferior y la pequeña información amarilla le dirá dónde encontrará El paquete que necesita importar.

Una vez hecho esto, vaya a la sección "biblioteca" en el panel izquierdo con "Proyecto" y dentro de ella se abrirá la pestaña "Android". Abra la sección de Java de la biblioteca y abra la clase APKExpansionPolicy. Si tiene errores y la importación org.apache.http.NameValuePair y la importación org.apache.http.client.utils.URLEncodedUtils son de color gris pálido, abra build.gradle (Proyecto: lo que sea) y asegúrese de que en "buildscript" bajo "dependencias" tiene el "classpath 'com.android.tools.build:gradle:1.5.0" incluido. El 1.5.0 puede ser diferente en su caso. Supongo que depende de tu versión de Studio. El mío es 1.5.1. Si el suyo es más nuevo, se le recordará que actualice los números.

Después de eso, vaya a "build.gradle (Módulo: biblioteca) e incluya el" useLibrary 'org.apache.http.legacy' en la sección "android". Sincronizar ahora (esquina superior izquierda / derecha) debe ofrecerse. Hazlo.

Si recibe más mensajes de error (no lo sabría porque lo hice al revés), los archivos de Apache pueden faltar en su proyecto, ya que apache ya no es compatible. Encuéntrelos en C / D: Usuarios / Yourname / AppData / Local / Android / Sdk / plataformas / android-23 / opcional y cópielos / péguelos en su carpeta project / app / libs. Debe tener un archivo opcional.json y un archivo org.apache.http.legacy.jar allí. Puede que sea mejor ir al sitio web de apache y descargar la versión más reciente: http://hc.apache.org/downloads.cgi Descomprímalo donde desee, ábralo, vaya a "lib", copie el httpclient-4.5.1 .jar y reemplace el archivo org.apache.http.legacy.jar con él.

Sincronice y reconstruya / limpie su proyecto y debería estar listo.

Por si acaso, abra su terminal (parte inferior izquierda de Android Studio) y escriba "gradlew clean". Instalará algunas cosas. Una vez hecho, escriba "gradlew assemble". Tardará unos minutos en terminar, pero le dará los errores si tiene alguno, por supuesto. Si no puede escribir nada en la Terminal, inicie el símbolo del sistema (botón de Windows + R), escriba cmd, presione OK, haga clic derecho en el título de la pequeña pantalla emergente negra (C: \ WINDOWS \ system32 \ cmd.exe) , Propiedades, Opciones, en la parte inferior de la ventana, verifique que "Usar consola heredada" esté grueso. Reinicie A.Studio.

¡Buena suerte!

Immy
fuente
1

Tuve que publicar ya que ninguna de las respuestas anteriores funcionó completamente para mí.

Estoy usando Android Studio

classpath 'com.android.tools.build:gradle:1.5.0'

compileSdkVersion 23
buildToolsVersion "23.0.3"

Paso 1: descargue el último archivo jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Paso 2: Copie y pegue el archivo .jar en la carpeta libs (crear si aún no existe) en su módulo (puede ser una aplicación o biblioteca)

Paso 3: Haz clic derecho en el frasco y "Agregar como biblioteca". Agregará automáticamente el archivo jar como una dependencia en el archivo gradle de su módulo

Paso 4: ahora su problema se resolverá automáticamente, pero en caso de que esté usando proguard en su aplicación, le dará una advertencia sobre archivos de clase duplicados y no le permitirá compilar. Es un error conocido y debe agregar lo siguiente a sus reglas de protección

-dontwarn org.apache.commons.**
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**

¡Buena suerte!

Mitra degradante
fuente
0

En mi caso, actualicé una de mis bibliotecas en mi proyecto de Android.

Estoy usando Reservoir como mi solución de almacenamiento en caché: https://github.com/anupcowkur/Reservoir

Yo fui de:

compile 'com.anupcowkur:reservoir:2.1'

A:

compile 'com.anupcowkur:reservoir:3.1.0'

El autor de la biblioteca debe haber eliminado la biblioteca commons-io del repositorio para que mi aplicación ya no funcione.

Tuve que incluir manualmente el commons-io agregando esto en gradle:

compile 'commons-io:commons-io:2.5'

https://mvnrepository.com/artifact/commons-io/commons-io/2.5

Simón
fuente