Android Gradle Apache HttpClient не існує?


263

Я намагаюся перетворити проект IntelliJ в систему Gradle Android Studio, але я стикаюся з помилками з Apache HttpClient? Я щось пропускаю, помилки, які я отримую, такі:

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

Мій файл build.gradle має такі залежності:

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

Здається, багато людей отримують подібну проблему, але ні SO, ні Google не мають рішення, тому сподіваюся, що це питання допоможе майбутнім шукачам.

Відповіді:


39

Я пропоную вам замінити застарілий апаратche HttpClient на новий HttpURLConnection.

Це більш чисте рішення, мігрувати його досить просто, і, як правило, краще дотримуватися останніх змін SDK, ніж намагатися зламати / виправити / вирішити: про це ти, як правило, пізніше шкодуєш :)

Крок 1

HttpGet httpGet = new HttpGet(url);

стає:

URL urlObj = new URL(url);

Крок 2

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

стає:

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

Крок 2 біс

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

стає:

int status = urlConnection.getResponseCode();

Привіт @ Benjamin, як надіслати URL методом PUT?
Dharma Sai Seerapu

@TrickySolutions Вибачте, не маю уявлення, ще не використовували метод PUT.
Бенджамін Піет

521

якщо ви використовуєте цільовий sdk як 23, додайте нижче код у своєму build.gradle

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

і змініть свій buildscript на

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

для отримання додаткової інформації перейдіть за цим посиланням


7
змінити buildscript до класів 'com.android.tools.build:gradle:1.3.0'
Jinu

3
Вже мав 1.3.1. Досі не вдається вирішити заняття в 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
А що, якщо ви хочете використовувати останню версію компонентів apache http?
russellhoff

2
Thanx Jinu, оновлення Android Studio з 1.3 до вище версії є обов'язковим.
Зробив

94

У мене була ця проблема, і тоді я знайшов ці сторінки: Тут ви бачите, що бібліотека apache застаріла, але вона не видаляється, тому вона повинна працювати. Це не так.

Див .

І тут ви можете побачити, як включити бібліотеку apache до свого проекту

Див .

Я вирішив проблему, додавши до мого файлу build.gradle, як рекомендовано у другому посиланні.

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

Однак це працює лише в тому випадку, якщо ви використовуєте gradle 1.3.0-beta2 або вище, тому вам доведеться додати це до залежностей buildscript, якщо ви користуєтеся нижчою версією:

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

Сподіваюсь, це допомагає.


Для мене це не вдалось із: Помилка: Не вдалося виконати завдання ': xenoAmp: mergeDebugJavaResources'. > Неможливо визначити папку розширення для L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ PackagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE з папками L: \ Projekty \ xenoampgit \ xenoAmp \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \
PackasedJarsJavaResources

@ssuukk Привіт, ти знайшов рішення для цієї помилки?
CeccoCQ

2
На жаль, рішенням було змінити ціль на поточний найвищий API, і це порушило багато речей! Тоді мені довелося додати "useLibrary", "classpath" PLUS посилання в спадщину, усталене апаш-ліб, як описано в цьому запитанні. І після того, як він був знову компільований, я просто вирішив взагалі вирвати код Apache і замінити його на URLConnection, що було простіше, ніж я думав.
ssuukk

Погодьтеся з ssuukk. Жодна з цих відповідей не працювала для мене, тому я врешті позбувся бібліотеки Apache. Я досить новачок в розробці Android, але це було просто.
John81

У мене був той самий випуск, і я виправив useLibrary 'org.apache.http.legacy', як сказав Мілош ... однак для @ssuukk з вашою проблемою ви можете спробувати додавати це завжди: android {packOptions {виключити 'META-INF / LICENSE 'виключити' META-INF / DEPENDENCIES 'виключити' META-INF / NOTICE 'виключити' META-INF / NOTICE.txt 'виключити' META-INF / MANIFEST '}}
Alexiscanny

53

Додайте в цю бібліотеку build.gradle

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

хтось може це пояснити? Чому це змушує працювати? Чому нам потрібно додавати цей рядок, окрім додавання залежностей?
Dan

2
@Dan тому, що бібліотеку org.apache.http було видалено з версією 23.
eltiare

Для уточнення це не йде в корінь build.gradle, а скоріше в папку модулів, яку ви будуєте (тобто "додаток")
hamx0r

37

копія, org.apache.http.legacy.jarяка знаходиться в Android/Sdk/platforms/android-23/optionalпапці, вapp/libs

а також додав цей рядок у файл app.gradle

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

Але якщо ви використовуєте більше бібліотек jar, ви можете використовувати цей спосіб

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

2
В інших моїх проектах це виявилося єдиною відповіддю, яка працювала так +1 і дякую.
Апк

чому це не відповідь?
dibble

1
Те саме для мене. Хтось повинен прийняти цю відповідь замість тієї, яку прийняв зараз.
Іван Фазанюк

Це найменший шлях опору, не впевнений, що я хочу знизити ступінь. Це добре для мене.
Ед Маннерс

Дякую! Це працює з Gradle-експериментальним плагіном 0.6.0-alpha5. Схоже, що "useLibrary" не існує в експериментальному плагіні.
monkey0506

14

В основному все, що вам потрібно зробити, це додати:

useLibrary  'org.apache.http.legacy'

У ваш build.gradleфайл.


9

Я зіткнувся з тим же питанням. Відповідь Даніеля Нугента трохи допомогла (після того, як HttpResponseбули знайдені його поради - але HttpClientвсе ще відсутня).

Отже, ось що це виправило для мене:

  1. (якщо цього ще не зроблено, похвалити попередні заяви про імпорт)
  2. відвідайте http://hc.apache.org/downloads.cgi
  3. отримати 4.5.1.zipз двійкового розділу
  4. розпакуйте його та вставте httpcore-4.4.3& httpclient-4.5.1.jarв project/libsпапку
  5. клацніть правою кнопкою миші та виберіть Додати як бібліотеку .

Сподіваюся, це допомагає.


9

У мене виникли подібні проблеми, можливо, ви зможете змусити його працювати, використовуючи подібний метод.

Спочатку спробуйте це з вашою поточною конфігурацією, виключайте httpclientз 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'
} 

У моєму випадку я виправив це за допомогою наступних банок:

Потім, в build.gradle, за винятком httpclientз 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'
}

Дякую за вашу відповідь, я не боюся, що ні для мене не працювали :(
Apqu

@tur це дивно, другий варіант працював для мене. Переконайтесь, що ваші старі файли jar видалені для другого параметра.
Даніель Нуген

Для чого libs/core.jar?
ІгорГанапольський

7

Ідеальний відповідь Джину та Даніеля

Додавши до цього, я вирішив проблему, скориставшись цим, якщо ваш compileSdkVersion дорівнює 19 (У моєму випадку)

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'

інше, якщо ваш compileSdkVersion 23, тоді використовуйте

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

5

Це я і зробив, і це працює на мене.

крок 1: додайте це у build.grade (модуль: додаток)

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

крок 2: синхронізуйте проект і виконано.


Будь-яка причина відмови від голосування?
NOT_A_PROGRAMMER

не вдалося вирішити з помилкою "Не вдалося вирішити: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2". Я використовую експериментальний gradle 0.6.0-beta. ви можете це зрозуміти?
RoFF

1

Версія HTTP-клієнта Apache, що надається на Android Android, була дуже стара .

Google Android 1.0 вийшов із попереднім BETA-знімком Apache HttpClient. Для того, щоб збігатися з першим Android-релізом, API Apache HttpClient 4.0 довелося передчасно заморозити, тоді як багато інтерфейсів та внутрішніх структур ще не були повністю розроблені. По мірі дозрівання Apache HttpClient 4.0 проект очікував, що Google включить в своє кодове останнє вдосконалення коду. На жаль, цього не сталося.

Хоча ви можете продовжувати користуватися старою застарілою бібліотекою шляхом useLibrary 'org.apache.http.legacy'вирішення (запропоновано @Jinu та іншими), вам дійсно потрібно кусати кулю та оновити щось інше, наприклад, рідний Android HttpUrlConnection, або якщо це не відповідає вашим потребам, ви можете використовувати бібліотеку OkHttp , на чому HttpUrlConnectionвсе-таки базується внутрішньо .

OkHttp на насправді має шар сумісності , який використовує той же інтерфейс, що і клієнт Apache, хоча вони не реалізують всі ті ж функції, тому пробіг може варіюватися.

Хоча можливо імпортувати нову версію клієнта Apache (як це запропонував @MartinPfeffer), ймовірно, що більшість класів і методів, якими ви користувалися раніше, були застарілими, і існує досить великий ризик, що оновлення введе помилки у вашому коді (наприклад, я знайшов деякі з'єднання, які раніше працювали з-за проксі, більше не працювали), тому це не чудове рішення.


1

Провівши дні на цю тему, мені вдалося остаточно її вирішити. На жаль, він нам потрібен, якщо ми хочемо використовувати файли розширення. Тут було запропоновано кілька людей, але для мене у відповідях бракувало декількох незначних деталей, які могли б зекономити для мене багато часу. Ось послідовність подій для таких початківців, як я, щоб заощадити ваш дорогоцінний час.

Спочатку я імпортував папку "бібліотека" з D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing до проекту, перейшовши у файл "Файл", "Новий", "Імпортувати модуль" та перейти до папки "бібліотека". Якщо ви відкриєте диспетчер SDK і натисніть "Запустити автономний менеджер SDK" у нижній частині спливаючого екрана, ви можете навести вказівник на папку "Додаткові елементи" внизу, і невелика жовта інформація підкаже, де ви знайдете пакет, який потрібно імпортувати.

Після цього перейдіть до розділу "бібліотека" на лівій панелі з пунктом "Проект", а в ньому відкриється вкладка "Android". Відкрийте розділ java бібліотеки та відкрийте клас APKExpansionPolicy. Якщо у вас є помилки, і імпорт org.apache.http.NameValuePair та імпорт org.apache.http.client.utils.URLEncodedUtils блідо-сірий, відкрийте build.gradle (Project: що завгодно) та переконайтеся, що в "buildscript" під "залежностями" у вас включено "classpath" com.android.tools.build:gradle:1.5.0 ". 1.5.0 може бути різним у вашому випадку. Я думаю, це залежить від вашої версії Studio. Шахта - 1.5.1. Якщо ваші новіші, вам буде запропоновано оновити номери.

Після цього перейдіть до "build.gradle (Модуль: бібліотека) і включіть" useLibrary "org.apache.http.legacy" у розділ "android". Синхронізувати зараз (верхній кут R / H) слід запропонувати. Зроби це.

Якщо ви отримаєте подальші повідомлення про помилки (я б не знав цього, оскільки я це зробив навпаки), файли Apache можуть бути відсутні у вашому проекті, оскільки апарат більше не підтримується. Знайдіть їх у C / D: Користувачі / Ваше ім’я / AppData / Місцеві / Android / Sdk / платформи / android-23 / необов'язково та скопіюйте / вставте їх у папку свого проекту / програми / libs. У вас там має бути необов'язковий.json та файл org.apache.http.legacy.jar. Можливо, вам буде краще зайти на веб-сайт apache та завантажити найновішу версію: http://hc.apache.org/downloads.cgi Розпакуйте його куди завгодно, відкрийте, перейдіть до "lib", скопіюйте httpclient-4.5.1 .jar файл та замініть ним файл org.apache.http.legacy.jar.

Синхронізуйте та відновіть / очистіть проект, і це має бути добре.

На всякий випадок відкрийте свій термінал (L / H внизу Android Studio) і введіть "gradlew clean". Він встановить кілька речей. Як тільки це буде зроблено, наберіть "gradlew збирати". На завершення знадобиться кілька хвилин, але якщо ви, звичайно, отримаєте помилки. Якщо у терміналі ви нічого не можете ввести, запустіть командний рядок (кнопка Windows + R), введіть cmd, натисніть OK, клацніть правою кнопкою миші на невеликому чорному спливаючому екрані (C: \ WINDOWS \ system32 \ cmd.exe) , Властивості, Параметри, внизу вікна переконайтеся, що "Використовувати застарілу консоль" загущена. Перезапустіть A.Studio.

Удачі!


1

Мені довелося розміщувати повідомлення, оскільки жоден з вищезазначених відповідей не працював на мене повністю.

Я використовую Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Крок 1. Завантажте найновіший файл jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Крок 2. Скопіюйте вставте .jar файл у папку libs (створіть, якщо він ще не існує) у вашому модулі (може бути додаток чи бібліотека)

Крок 3: Клацніть правою кнопкою миші на баночці та «Додати як бібліотеку». Він автоматично додасть jar файл як залежність у файл gradle вашого модуля

Крок 4: Тепер ваша проблема автоматично вирішиться, але якщо ви використовуєте Proguard у своєму додатку, він попередить вас про копії файлів класу та не дозволить створювати. Це відома помилка, і її потрібно додати, дотримуючись своїх правил-захисників

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

Щасти!


0

У моєму випадку я оновив одну зі своїх бібліотек у своєму проекті Android.

Я використовую Резервуар як своє рішення для зберігання кешу: https://github.com/anupcowkur/Reservoir

Я пішов:

compile 'com.anupcowkur:reservoir:2.1'

До:

compile 'com.anupcowkur:reservoir:3.1.0'

Автор бібліотеки, мабуть, видалив бібліотеку commons-io з репо, щоб моя програма більше не працювала.

Мені довелося вручну включити commons-io, додавши це на gradle:

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

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.