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 нет решения, поэтому я надеюсь, что этот вопрос поможет будущим пользователям.

Apqu
источник

Ответы:

39

Я предлагаю вам заменить устаревший Apache 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();
Бенджамин Пиетт
источник
Эй, Бенджамин, как отправить URL методом PUT?
Дхарма Саи 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' 

для получения дополнительной информации перейдите по этой ссылке

Jinu
источник
7
измените свой сборочный скрипт на classpath '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
Энрике де Соуза
2
андроид студия 1.4 бета 2
Jinu
2
А что, если вы хотите использовать последнюю версию компонентов Apache http?
russellhoff
2
Спасибо Jinu, необходимо обновить Android Studio с версии 1.3 до версии выше. Получил это работает
mithil1501
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 \ middleates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE с папками L: \ Projekty \ xenoampgit \ build_xenAmp \ промежуточные звенья \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ промежуточные звенья \ packagedJarsJavaResources \ debug
ssuukk
@ssuukk Привет, вы нашли решение этой ошибки?
CeccoCQ
2
К сожалению, решение состояло в том, чтобы изменить цель на текущий самый высокий API, и это сломало МНОГО вещей! Затем мне пришлось добавить «useLibrary», «classpath» PLUS, ссылку на устаревшую Apache lib, как описано в другом месте этого вопроса. И после того, как он снова стал компилируемым, я просто решил полностью отказаться от кода Apache и заменить его на URLConnection, что оказалось проще, чем я думал.
Ссуук
Согласна со ссуукком. Ни один из этих ответов не помог мне, поэтому я также избавился от библиотек Apache. Я довольно новичок в разработке Android, но это было просто.
Джон81
У меня была та же проблема, и я исправил с помощью useLibrary org.apache.http.legacy, как сказал Милос ... однако для @ssuukk с вашей проблемой вы можете попытаться добавить это всегда: android {packagingOptions {exclude 'META-INF / LICENSE 'exclude' META-INF / DEPENDENCIES 'exclude' META-INF / NOTICE 'exclude' META-INF / NOTICE.txt 'exclude' META-INF / MANIFEST '}}
Alexiscanny
53

Добавить эту библиотеку в build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Даршан Дхория
источник
может кто-нибудь объяснить это? Почему это заставляет это работать? Почему нам нужно добавить эту строку, кроме добавления зависимостей?
Дан
2
@ Дэн, это потому, что библиотека 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'])
DO01
источник
2
В другом из моих проектов это оказалось единственным ответом, который работал так +1 и спасибо.
Апк
почему это не ответ?
Диббл
1
Мне то же. Кто-то должен принять этот ответ вместо того, который принял сейчас.
Иван Фазанюк
Это наименьший путь сопротивления, не уверен, что я хочу унизить Gradle. Это хорошо для меня.
Эд Мэннерс
Спасибо! Это работает с экспериментальным плагином 0.6.0-alpha5. «useLibrary» не существует в экспериментальном плагине.
monkey0506
14

В общем, все, что вам нужно сделать, это добавить:

useLibrary  'org.apache.http.legacy'

К вашему build.gradleфайлу.

ATechPerson
источник
9

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

Так вот что исправило это для меня:

  1. (если это еще не сделано, похвалить предыдущие инструкции import)
  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
@ странно, второй вариант у меня сработал. Убедитесь, что ваши старые файлы JAR удалены для второго варианта.
Даниэль Ньюджент
Для чего libs/core.jar?
Игорь Ганапольский
7

Идеальный ответ от Jinu и Даниэль

В дополнение к этому я решил проблему с помощью этого, если ваш 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
источник
Есть ли причина для отрицательного голосования?
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-бета. Вы можете понять это?
RoFF
1

Версия HTTP-клиента Apache, представленная на складе Android, была очень старой .

Google Android 1.0 был выпущен с предварительной бета-версией Apache HttpClient. Чтобы совпасть с первым выпуском Android, API-интерфейсы Apache HttpClient 4.0 пришлось преждевременно заморозить, хотя многие интерфейсы и внутренние структуры все еще не были полностью проработаны. По мере развития Apache HttpClient 4.0 проект ожидал, что Google включит последние усовершенствования кода в свое кодовое дерево. К сожалению, этого не произошло.

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

OkHttp на самом деле имеет уровень совместимости, который использует тот же API, что и клиент Apache, хотя они не реализуют все те же функции, поэтому пробег может отличаться.

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

Тим Рей
источник
1

Потратив несколько дней на эту тему, мне наконец удалось ее решить. К сожалению, нам это нужно, если мы хотим использовать файлы расширения. Решение было предоставлено несколькими людьми здесь, но для меня в ответах отсутствовали некоторые мелкие детали, которые могли бы сэкономить много времени для меня. Вот последовательность событий для новичков, как я, чтобы сэкономить ваше драгоценное время.

Сначала я импортировал папку «library» из D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing в проект, перейдя в меню «Файл», «Новый», «Модуль импорта» и перейдя в папку «библиотека». Если вы откроете SDK Manager и нажмете «Запустить автономный SDK Manager» в нижней части всплывающего окна, вы можете навести указатель мыши на папку «Extras» внизу, и небольшая желтая информация укажет вам, где вы найдете пакет, который вам нужно импортировать.

Как только это будет сделано, перейдите в раздел «библиотека» на левой панели с «Проектом» и откройте вкладку «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 может отличаться в вашем случае. Я думаю, это зависит от вашей версии студии. Мой 1.5.1. Если у вас новее, вам напомнят обновить номера.

После этого перейдите к «build.gradle (Module: library)» и включите «useLibrary» org.apache.http.legacy »в раздел« android ». Синхронизировать сейчас (правый верхний угол) должно быть предложено. Сделай это.

Если вы получите дальнейшие сообщения об ошибках (я не буду знать об этом, потому что я сделал это наоборот), файлы Apache могут отсутствовать в вашем проекте, так как apache больше не поддерживается. Найдите их в C / D: Users / Yourname / AppData / Local / Android / Sdk / platform / android-23 / необязательно и скопируйте / вставьте их в папку yourproject / app / 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.

Синхронизируйте и пересоберите / очистите ваш проект, и все должно быть хорошо.

На всякий случай откройте свой терминал (в нижней части Android Studio) и введите «gradlew clean». Будет установлено несколько вещей. Как только это будет сделано, введите "gradlew сборки". Это займет несколько минут, но это даст вам ошибки, если они у вас есть, конечно. Если вы не можете ничего ввести в Терминале, запустите командную строку (кнопка Windows + R), введите cmd, нажмите OK, щелкните правой кнопкой мыши заголовок небольшого черного всплывающего экрана (C: \ WINDOWS \ system32 \ cmd.exe) , Свойства, Параметры, в нижней части окна проверьте, что «Использовать устаревшую консоль» имеет толщину. Перезапустите A.Studio.

Удачи!

Immy
источник
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 в своем приложении, он выдаст вам предупреждение о дублировании файлов классов и не позволит вам собрать. Это известная ошибка, и вам необходимо добавить следующие правила в ваши proguard-правила

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

Удачи!

Дебашиш Митра
источник
0

В моем случае я обновил одну из моих библиотек в своем проекте Android.

Я использую Reservoir в качестве решения для хранения кеша: 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

Саймон
источник