web-dev-qa-db-fra.com

Android Gradle Apache HttpClient n'existe pas?

J'essaie de convertir un projet IntelliJ dans le système Gradle de Android Studio, mais je rencontre 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 {
    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')
}

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

252
Apqu

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

C'est une solution plus propre, il est assez facile de migrer et il est généralement préférable de s'en tenir aux dernières modifications du SDK plutôt que d'essayer de pirater/corriger/contourner le problème: 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();
37
Benjamin Piette

si vous utilisez un sdk cible en tant que 23, ajoutez le code ci-dessous dans votre build.gradle

Android{
    compileSdkVersion 23
    buildToolsVersion '23.0.1'
    useLibrary  'org.Apache.http.legacy'
}

et changez votre buildscript en

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

pour plus d'informations suivez ceci lien

515
Jinu

J'ai eu ce problème et puis j'ai trouvé ces pages: Vous pouvez voir ici que la bibliothèque Apache est obsolète, mais elle n'est pas supprimée, cela devrait donc fonctionner. Ce n'est pas.

Voir .

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

Voir .

J'ai résolu le problème en ajoutant ce qui suit dans 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érieure, vous devrez donc ajouter ceci aux dépendances de buildscript si vous utilisez une version plus basse:

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

J'espère que cela t'aides.

92
Milos Savanovic

Ajouter cette bibliothèque dans build.gradle

 Android {
      useLibrary 'org.Apache.http.legacy'
 }
43
Darshan Dhoriya

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

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

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

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

compile fileTree(dir: 'libs', include: ['*.jar'])
37
do01

Fondamentalement, tout ce que vous avez à faire est d’ajouter:

useLibrary  'org.Apache.http.legacy'

Dans votre fichier build.gradle.

12
ATechPerson

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

Essayez d’abord avec votre configuration actuelle, excluez httpclient de 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'
} 

Dans mon cas, je l'ai corrigé en utilisant les bocaux suivants:

Ensuite, dans le build.gradle, en excluant httpclient de 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'
}
9
Daniel Nugent

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

Alors voici ce qui me l'a corrigé:

  1. (si ce n'est déjà fait, félicitez les déclarations d'importation précédentes)
  2. visitez http://hc.Apache.org/downloads.cgi
  3. récupère le 4.5.1.Zip de la section binaire
  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 pot et choisissez Ajouter en tant que bibliothèque .

J'espère que ça aide.

9
Martin Pfeffer

Réponse parfaite de Jinu et Daniel

Ajoutant à cela, j'ai résolu le problème en utilisant This, si votre compileSdkVersion est 19 (IN MY CASE)

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'

sinon, si votre compileSdkVersion est 23, 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'
    }
}
7
Sophia

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

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

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

étape 2: synchroniser le projet et terminé.

5
NOT_A_PROGRAMMER

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

Google Android 1.0 a été publié avec un instantané pré-BETA d’Apache HttpClient. Pour coïncider avec la première Android version _, les API Apache HttpClient 4.0 devaient être gelées prématurément, tandis que de nombreuses interfaces et structures internes n'étaient pas encore entièrement élaborées. Alors qu'Apache HttpClient 4.0 arrivait à maturité, le projet s'attendait à ce que Google intègre les dernières améliorations en matière de code dans son arborescence. Malheureusement, cela ne s'est pas produit.

Bien que vous puissiez continuer à utiliser l’ancienne bibliothèque obsolète via la solution de contournement useLibrary 'org.Apache.http.legacy' (suggéré par @Jinu et d’autres), vous devez vraiment mordre la main. bullet et passez à autre chose, par exemple le Androidnatif _ HttpUrlConnection , ou si cela ne répond pas à vos besoins, vous pouvez utiliser le OkHttp bibliothèque , qui est ce que HttpUrlConnection est en interne basé sur 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 all des mêmes caractéristiques, donc votre kilométrage peut varier.

Bien que , 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 méthodes que vous utilisiez auparavant ont été déconseillées, et il y a un risque assez important que la mise à jour introduise des bogues dans votre code (par exemple, j'ai trouvé que certaines connexions qui fonctionnaient auparavant derrière un proxy ne fonctionnaient plus), ce n'est donc pas une bonne solution.

1
Tim Rae

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'

compileSdkVersion 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 )

Étape 2: Copier coller le fichier .jar dans le dossier libs (créer s'il n'existe pas déjà) dans votre module (peut être une application ou une bibliothèque)

Étape 3: Faites un clic droit sur le pot et "Ajouter en tant que bibliothèque". Il ajoutera automatiquement le fichier jar en tant que dépendance dans le fichier de classement 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 classe en double et ne vous laissera pas construire. C'est un bogue connu et vous devez ajouter ce qui suit à vos règles de proguard

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

Bonne chance!

1
Debasish Mitra

Après avoir passé des jours sur le sujet, j'ai finalement réussi à le résoudre. 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, il manquait quelques détails mineurs qui auraient pu me faire gagner beaucoup de temps. Voici la séquence d'événements pour les novices comme moi pour vous faire gagner un temps précieux.

D'abord, j'ai importé le dossier "library" de D:\Users\Imre\AppData\Local\Android\sdk1\extras\google\play_licensing dans le projet en allant dans Fichier, Nouveau, Module d'importation et en accédant au dossier "library". Si vous ouvrez le SDK Manager et cliquez sur "Lancer le logiciel autonome SDK Manager" au bas de la fenêtre contextuelle, vous pouvez passer votre pointeur de la souris sur le dossier "Extras" dans le bas et la petite info jaune vous indiquera où vous trouverez le paquet que vous devez importer.

Une fois que cela est fait, allez dans la section "bibliothèque" dans le volet gauche avec "Projet" et dans celui-ci l'onglet "Android" ouvert. Ouvrez la section Java de la bibliothèque et ouvrez la classe APKExpansionPolicy. Si vous avez des erreurs et que les org.Apache.http.NameValuePair et l'importation org.Apache.http.client.utils.URLEncodedUtils sont gris pâle, ouvrez le build.gradle (Project: tout ce que vous voulez) 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 pourrait ê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 à "build.gradle (Module: bibliothèque) et incluez le" useLibrary "org.Apache.http.legacy" dans la section "Android". Sync Now (coin supérieur droit) devrait ê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 risquent de ne pas figurer dans 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/facultatif et copiez-les/collez-les dans votre dossier projet/app/libs. Vous devriez avoir un fichier facultatif.json et un fichier org.Apache.http.legacy.jar. Vous feriez peut-être mieux d'aller sur le site Web d'Apache et télécharger la dernière version: http://hc.Apache.org/downloads.cgi Décompressez-le où vous voulez, ouvrez-le, allez à "lib", copiez le fichier httpclient-4.5.1.jar et remplacez-le par le fichier org.Apache.http.legacy.jar.

Synchronisez et reconstruisez/nettoyez votre projet et ça devrait aller.

Juste au cas où, ouvrez votre terminal (L/H en bas de Android Studio) et tapez "gradlew clean". Il va installer quelques petites choses. Une fois que c'est fait, tapez "gradlew assemble". Cela prendra quelques minutes pour terminer, mais cela vous donnera les erreurs si vous en avez bien sûr. Si vous ne pouvez rien entrer dans le terminal, lancez la commande Invite (bouton Windows + R), tapez cmd, cliquez sur OK, cliquez avec le bouton droit de la souris sur le titre du petit écran contextuel noir (C:\WINDOWS\system32\cmd.exe). , Propriétés, Options, dans le bas de la fenêtre, vérifiez que "Utiliser la console héritée" est épaissi. Redémarrez A.Studio.

Bonne chance!

1
Immy

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

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

Je suis parti de:

compile 'com.anupcowkur:reservoir:2.1'

À:

compile 'com.anupcowkur:reservoir:3.1.0'

L'auteur de la bibliothèque doit avoir supprimé la bibliothèque commons-io du référentiel pour que mon application ne fonctionne plus.

Je devais inclure manuellement commons-io en ajoutant ceci à gradle:

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

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

0
Simon

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

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

0
Likwidsage