web-dev-qa-db-fra.com

Comment ajouter l'API HTTP Apache (héritée) en tant que dépendance de compilation à build.grade pour Android M?

Comme mentionné ici , Android M ne supportera pas l'API HTTP Apache. Les docs affirment:

utilisez plutôt la classe HttpURLConnection.

ou

Pour continuer à utiliser les API HTTP Apache, vous devez d'abord déclarer la dépendance suivante à la compilation dans votre fichier build.gradle:

Android {useLibrary 'org.Apache.http.legacy'}

J'ai converti une grande partie de l'utilisation de HttpClient de mon projet en HttpURLConnection. Cependant, j'ai toujours besoin d'utiliser HttpClient dans quelques zones. Par conséquent, j'essaie de déclarer 'org.Apache.http.legacy' comme dépendance à la compilation, mais j'obtiens une erreur dans build.gradle:

Méthode DSL Gradle introuvable: 'useLibrary ()'

Ma question est la suivante: comment déclarer "org.Apache.http.legacy" comme dépendance à la compilation dans mon projet?

Toute aide est très appréciée. Merci

93
Virat Singh

Pour l'API 23:

build.gradle de niveau supérieur - /build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.3.1'
    }
}
...

build.gradle spécifique au module - /app/build.gradle

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

Documents officiels (pour la prévisualisation cependant): http://developer.Android.com/about/versions/Marshmallow/Android-6.0-changes.html#behavior-Apache-http-client

Dernières Android changelog du plugin Gradle: http://tools.Android.com/tech-docs/new-build-system

170
hidro

Une autre alternative consiste simplement à ajouter une dépendance jbundle. Ceci est plus Android Studio convivial car Android Studio ne donne pas le message "Impossible de résoudre le symbole ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
 }
28
nexDev

Dans votre fichier build.gradle, ajoutez seLibrary 'org.Apache.http.legacy' selon Android 6.0 Changes> Apache HTTP Client Removal notes.

Android {
    ...
    useLibrary 'org.Apache.http.legacy'
    ...
}

Pour éviter les erreurs de lien manquantes, ajoutez des dépendances

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
}

en utilisant "à condition" la dépendance ne sera pas incluse dans l'apk

13
lrampazzo

Vous venez de copier le fichier: org.Apache.http.legacy.jar du dossier Android/Sdk/platforms/Android-23/optional dans le dossier du projet app/libs.

Travaillé comme un charme pour 23.1.1.

11
CodeBulls Inc.

Note pour Android 9 (Pie).

En plus de useLibrary 'org.Apache.http.legacy', vous devez ajouter AndroidManifest.xml:

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

Source: https://developer.Android.com/about/versions/pie/Android-9.0-changes-28

8
Gunnar Bernstein

Comme les réponses sont un peu anciennes, je vais mettre ma solution (ce qui a fonctionné pour moi), cela peut être utile pour quelqu'un d'autre ... J'ai pris ma solution de la documentation officielle d'Apache, pas de travail -environ.

1/en grade:

dependencies {
...
// This is the maintained version from Apache.
compile group: 'cz.msebera.Android', name: 'httpclient', version: '4.4.1.1'
}

2/dans le reste de l'application, remplacez le org.Apache.http par cz.msebera.Android.httpclient et toutes vos importations (dépendances) seront corrigées. vous pouvez simplement faire ctrl + shift + R et le remplacer dans tout le projet.

3
ahmed_khan_89

La suppression de la bibliothèque Apache a été annoncée il y a longtemps. Notre bon ami Jesse Wilson nous a donné un indice en 2011: http://Android-developers.blogspot.com/2011/09/androids-http-clients.html

Google a cessé de travailler sur ApacheHTTPClient il y a quelque temps déjà. Par conséquent, toute bibliothèque qui en dépend encore doit être ajoutée à la liste des bibliothèques obsolètes, à moins que les responsables ne mettent à jour leur code.

<rant> Je ne peux pas vous dire combien d'arguments techniques j'ai eu avec des personnes qui ont insisté pour rester avec le client HTTP Apache. Certaines applications majeures vont casser parce que la direction de mes anciens employeurs, qui n'étaient pas encore nommés, n'a pas écouté leurs meilleurs ingénieurs ou ne savait pas ce dont ils parlaient quand ils ont ignoré l'avertissement ... le pont.

Je gagne.

</rant>

2
Coder Roadie

J'ai résolu ce problème comme suit:

1.) Définissez classpath dans le fichier de construction de niveau supérieur en tant que GUG mentionné:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.3.0-beta2'
    }
    allprojects {
        repositories {
           jcenter()
        }
    }
}

2.) Dans le fichier de construction du module spécifique:

Android {
   useLibrary 'org.Apache.http.legacy'
   compileSdkVersion 'Android-MNC'
   buildToolsVersion '23.0.0 rc3'
}
2
A.D.

cela devrait aider:

Android {
    ...
    useLibrary 'org.Apache.http.legacy'
    ...
}

Pour éviter les erreurs de lien manquantes, ajoutez des dépendances

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
}

ou

dependencies {
    compileOnly 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.Apache.http.client:4.1.2'
}

parce que

Warning: Configuration 'provided' is obsolete and has been replaced with 'compileOnly'.
1
logeshwaran

Pour résoudre les problèmes, assurez-vous que vous utilisez les outils de génération, version "23.0.0 rc2", avec les outils suivants, dépendances de génération:

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