Android Gradle Apache HttpClient n’existe pas?

J’essaie de convertir un projet IntelliJ au système Gradle d’Android Studio, mais je suis en train de rencontrer des erreurs avec Apache HttpClient? Est-ce que je manque quelque chose, les erreurs que je reçois sont les suivantes:

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 

Mon fichier build.gradle a les dépendances suivantes:

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

Il semble que beaucoup de personnes rencontrent un problème similaire, mais ni SO ni Google n’ont de solution, alors j’espère que cette question aidera les futurs chercheurs.

Je vous suggère de remplacer le Apache HttpClient obsolète par le nouveau HttpURLConnection.

C’est une solution plus propre, c’est assez facile à migrer, et en général il vaut mieux s’en tenir aux dernières modifications du SDK que d’essayer de pirater / patcher / contourner: vous le regretterez généralement plus tard 🙂

Étape 1

 HttpGet httpGet = new HttpGet(url); 

devient:

 URL urlObj = new URL(url); 

Étape 2

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

devient:

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

Étape 2 bis

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

devient:

 int status = urlConnection.getResponseCode(); 

si vous utilisez le sdk cible comme 23 append le code ci-dessous dans votre build.gradle

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

et changez votre script de compilation en

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

pour plus d’infos suivez ce lien

J’ai eu ce problème, puis j’ai trouvé ces pages: Ici, vous pouvez voir que la bibliothèque Apache est obsolète, mais elle n’est pas supprimée, elle devrait donc fonctionner. Ce n’est pas le cas.

Voir

Et ici vous pouvez voir comment inclure une bibliothèque Apache dans votre projet

Voir

J’ai résolu le problème en ajoutant les éléments suivants à mon fichier build.gradle, comme recommandé dans le deuxième lien.

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

Cependant, cela ne fonctionne que si vous utilisez gradle 1.3.0-beta2 ou supérieur, vous devrez donc append ceci aux dépendances de buildscript si vous êtes sur une version inférieure:

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

J’espère que cela t’aides.

copier org.apache.http.legacy.jar qui se trouve dans Android/Sdk/platforms/android-23/optional dossier Android/Sdk/platforms/android-23/optional dans app/libs

et a également ajouté cette ligne au fichier app.gradle

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

Mais si vous utilisez plus de bibliothèques jar, vous pouvez utiliser cette méthode

 comstack fileTree(dir: 'libs', include: ['*.jar']) 

Ajoutez cette bibliothèque dans Build.Gradle

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

J’espère que cela fonctionne.

En gros, tout ce que vous devez faire est d’append:

 useLibrary 'org.apache.http.legacy' 

Dans votre fichier build.gradle.

J’ai rencontré le même problème. La réponse de Daniel Nugent a aidé un peu (après avoir suivi son conseil, HttpResponse été trouvé – mais le HttpClient était toujours manquant).

Alors voici ce qui a été corrigé pour moi:

  1. (si ce n’est déjà fait, recommandez les instructions d’importation précédentes)
  2. visitez http://hc.apache.org/downloads.cgi
  3. obtenir le 4.5.1.zip de la section binary
  4. décompressez-le et collez httpcore-4.4.3 & httpclient-4.5.1.jar dans le dossier project/libs
  5. Cliquez avec le bouton droit sur le fichier jar et choisissez Ajouter en tant que bibliothèque .

J’espère que cela aide.

J’ai rencontré des problèmes similaires, vous pourriez être en mesure de le faire fonctionner en utilisant une méthode similaire.

Tout d’abord, essayez ceci avec votre configuration actuelle, excluez httpclient de httpmime :

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

Dans mon cas, je l’ai corrigé en utilisant les pots suivants:

  • httpclient-android-4.3.5.1.jar
  • httpmime-4.3.5.jar

Ensuite, dans le build.gradle, en excluant httpclient de httpmime :

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

Réponse parfaite par Jinu et Daniel

Ajoutant à cela j’ai résolu le problème en utilisant ceci, si votre comstackSdkVersion est 19 (DANS MON CAS)

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

sinon si votre comstackSdkVersion est 23 alors utilisez

 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' } } 

C’est ce que j’ai fait et ça marche pour moi.

étape 1: ajoutez ceci dans le build.grade (module: app)

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

étape 2: synchroniser le projet et terminé.

La version du client HTTP Apache fournie sur stock Android était très ancienne .

Google Android 1.0 est sorti avec un instantané pré-BETA d’Apache HttpClient. Pour coïncider avec la première version d’Android, les API Apache HttpClient 4.0 devaient être gelées prématurément, alors que de nombreuses interfaces et structures internes n’étaient toujours pas complètement développées. Comme Apache HttpClient 4.0 arrivait à maturité, le projet s’attendait à ce que Google intègre les dernières améliorations de code dans son arbre de code. Malheureusement, cela ne s’est pas produit.

Bien que vous puissiez continuer à utiliser l’ancienne bibliothèque obsolète via la solution useLibrary 'org.apache.http.legacy' contournement useLibrary 'org.apache.http.legacy' de useLibrary (suggérée par @Jinu et d’autres), vous devez vraiment mordre la balle et mettre à jour quelque chose, par exemple le HttpUrlConnection natif Android HttpUrlConnection , ou si cela ne répond pas à vos besoins, vous pouvez utiliser la bibliothèque OkHttp , qui est ce HttpUrlConnection quoi HttpUrlConnection est basé en interne de toute façon.

OkHttp a en fait un calque de compatibilité qui utilise la même API que le client Apache, bien qu’ils n’implémentent pas toutes les mêmes fonctionnalités, de sorte que votre kilométrage peut varier.

Bien qu’il soit possible d’importer une version plus récente du client Apache (comme suggéré par @MartinPfeffer), il est probable que la plupart des classes et des méthodes que vous utilisiez étaient obsolètes, et il y a un grand risque que la mise à jour introduise des bogues. dans votre code (par exemple, certaines connexions qui fonctionnaient auparavant derrière un proxy ne fonctionnaient plus), ce n’est donc pas une excellente solution.

Après avoir passé des jours sur le sujet, j’ai réussi à le résoudre finalement. Malheureusement, nous en avons besoin si nous voulons utiliser des fichiers d’extension. La solution a été fournie par quelques personnes ici, mais pour moi les réponses manquaient quelques détails mineurs qui auraient pu me faire gagner beaucoup de temps. Voici la séquence des événements pour les novices comme moi afin de sauver votre temps précieux.

J’ai d’abord importé le dossier “library” de D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing vers le projet en allant dans Fichier, Nouveau, Importer le module et en accédant au dossier “library”. Si vous ouvrez le Gestionnaire de SDK et cliquez sur “Lancer Standalone SDK Manager” dans le bas de l’écran contextuel, vous pouvez placer votre pointeur sur le dossier “Extras” dans le bas et les petites informations jaunes vous indiqueront où vous trouverez le package que vous devez importer.

Une fois cela fait, allez dans la section “bibliothèque” dans le volet de gauche avec “Projet” et dans son onglet “Android” ouvert. Ouvrez la section java de la bibliothèque et ouvrez la classe APKExpansionPolicy. Si vous avez des erreurs et que les fichiers import org.apache.http.NameValuePair et import org.apache.http.client.utils.URLEncodedUtils sont gris pâle, ouvrez le build.gradle (Project: what) et assurez-vous que dans “buildscript” sous “dépendances” vous avez le “classpath ‘com.android.tools.build:gradle:1.5.0” inclus. Le 1.5.0 peut être différent dans votre cas. Je suppose que cela dépend de votre version de Studio. Le mien est 1.5.1. Si le vôtre est plus récent, il vous sera demandé de mettre à jour les numéros.

Après cela, allez dans “build.gradle (Module: library) et incluez la” useLibrary “org.apache.http.legacy” dans la section “android”. Sync Now (R / H) doit être proposé. Fais le.

Si vous recevez d’autres messages d’erreur (je ne le saurais pas parce que je l’ai fait dans l’autre sens), les fichiers Apache pourraient être absents de votre projet, car Apache n’est plus pris en charge. Trouvez-les dans C / D: Utilisateurs / Yourname / AppData / Local / Android / Sdk / plates-formes / android-23 / optional et copiez / collez-les dans votre dossier project / app / libs. Vous devriez avoir un fichier optional.json et un fichier org.apache.http.legacy.jar. Vous devriez peut-être aller sur le site Web d’Apache et télécharger la version la plus récente: http://hc.apache.org/downloads.cgi Décompressez-le où vous voulez, ouvrez-le, allez dans “lib”, copiez le httpclient-4.5.1 fichier .jar et remplacez le fichier org.apache.http.legacy.jar par celui-ci.

Synchronisez et reconstruisez / nettoyez votre projet et ça devrait être bon.

Juste au cas où, ouvrez votre terminal (L / H en bas de Android Studio) et tapez “gradlew clean”. Il va installer quelques choses. Une fois cela fait, tapez “gradlew assemble”. Cela prendra quelques minutes pour finir, mais cela vous donnera des erreurs si vous en avez bien sûr. Si vous ne pouvez rien taper dans le Terminal, lancez l’invite de commande (bouton Windows + R), tapez cmd, cliquez sur OK, cliquez avec le bouton droit sur le titre de la petite fenêtre contextuelle noire (C: \ WINDOWS \ system32 \ cmd.exe) , Propriétés, Options, en bas de la fenêtre, vérifiez que “Utiliser la console héritée” est épaissi. Redémarrez A.Studio.

Bonne chance!

Je devais poster car aucune des réponses ci-dessus ne fonctionnait complètement pour moi.

J’utilise Android Studio

 classpath 'com.android.tools.build:gradle:1.5.0' comstackSdkVersion 23 buildToolsVersion "23.0.3" 

Étape 1: Téléchargez le dernier fichier jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Etape 2: Copiez le fichier .jar dans le dossier libs (créez s’il n’existe pas déjà) dans votre module (peut être une application ou une bibliothèque)

Étape 3: Cliquez avec le bouton droit de la souris sur le fichier jar et sur “Ajouter en tant que bibliothèque”. Il appenda automatiquement le fichier jar en tant que dépendance dans le fichier graduel de votre module

Étape 4: Maintenant, votre problème sera automatiquement résolu, mais si vous utilisez proguard dans votre application, il vous avertira des fichiers de classes en double et ne vous laissera pas construire. C’est un bogue connu et vous devez append les règles suivantes à vos règles de proguard

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

Bonne chance!

Dans mon cas, j’ai mis à jour une de mes bibliothèques dans mon projet Android.

J’utilise Reservoir comme solution de stockage de cache: https://github.com/anupcowkur/Reservoir

Je suis passé de:

 comstack 'com.anupcowkur:reservoir:2.1' 

À:

 comstack 'com.anupcowkur:reservoir:3.1.0' 

L’auteur de la bibliothèque doit avoir supprimé la bibliothèque commons-io du repository afin que mon application ne fonctionne plus.

J’ai dû inclure manuellement les commons-io en les ajoutant sur gradle:

 comstack 'commons-io:commons-io:2.5' 

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

J’ai cloné les éléments suivants: https://github.com/google/play-licensing

Ensuite, j’ai importé cela dans mon projet.