Как добавить Apache HTTP API (устаревший) в качестве зависимости во время компиляции в build.grade для Android M?

85

Как уже упоминалось , Android M не поддерживает API Apache HTTP. Состояние документов:

используйте вместо этого класс HttpURLConnection.

или

Чтобы продолжить использование API-интерфейсов Apache HTTP, вы должны сначала объявить следующую зависимость времени компиляции в файле build.gradle:

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

Я преобразовал большую часть моего использования проекта HttpClient в HttpURLConnection, однако мне все еще нужно использовать HttpClient в нескольких областях. Следовательно, я пытаюсь объявить "org.apache.http.legacy" как зависимость времени компиляции, но получаю ошибку в build.gradle:

Gradle Метод DSL не найден: 'useLibrary()'

Мой вопрос: как объявить "org.apache.http.legacy" как зависимость времени компиляции в моем проекте?

Любая помощь очень ценится. Благодаря

  • 3
    Убедитесь, что вы используете довольно свежий плагин Gradle для Android. Я предполагаю, что это действительно новое, то есть вам понадобится что-то вроде 1.3.0-rc2 . Вы также можете подумать об использовании собственной Apache-совместимой версии HttpClient .
  • 0
    Спасибо за быстрый ответ @CommonsWare ... Вы ссылаетесь на строку "classpath" com.android.tools.build:gradle:1.0.0 'в файле build.gradle верхнего уровня?
Показать ещё 9 комментариев
Теги:
httpclient
build.gradle
android-6.0-marshmallow

9 ответов

153
Лучший ответ

Для API 23:

Верхний уровень build.gradle -/build.gradle

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

Специфичный для модуля build.gradle -/app/build.gradle

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

Официальные документы (для предварительного просмотра): http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-apache-http-client

Последняя версия андроида gradle: http://tools.android.com/tech-docs/new-build-system

  • 2
    Я обновляю версию сборки gradle, а затем объявляю useLibrary для apache, но затем также получаю ошибку: Ошибка: (204, 13) ошибка: не удается найти класс символов Ошибка DefaultHttpClient: (204, 48) ошибка: не удается найти класс символов Ошибка DefaultHttpClient: Ошибка (205, 13): не удается найти класс символов. Ошибка HttpPost: ошибка (205, 37): не удается найти класс символов. Ошибка HttpPost: (207, 13) ошибка: не удается найти класс символов. Ошибка HttpResponse: (208, 13) ошибка: не удается найти класс символов HttpEntity Ошибка: (209, 19) ошибка: не удается найти переменную символа EntityUtils
  • 1
    Что-то, что я упустил из ответа: вы должны убедиться, что путь к классу gradle находится в файле сборки верхнего уровня вашего приложения, где useLibrary должен быть в файле сборки вашего приложения.
Показать ещё 9 комментариев
28

Другая альтернатива - просто добавить зависимость jbundle. Это больше подходит для Android Studio, поскольку Android Studio не дает сообщение "не может разрешить символ..."

 dependencies {
    compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
 }
  • 0
    не работал для меня ...
  • 0
    он доступен в репозитории mavenCentral ().
Показать ещё 8 комментариев
10

Скопированный файл: org.apache.http.legacy.jar из Android/Sdk/platforms/android-23/optional в папку проекта app/libs.

Работает как шарм для 23.1.1.

10

В файле build.gradle добавьте useLibrary 'org.apache.http.legacy' согласно Android 6.0 Changes > Apache HTTP Client Removal отмечает.

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

Чтобы избежать недостающих ошибок ссылок, добавьте в зависимости

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

используя 'provided', зависимость не будет включена в apk

  • 0
    спасибо .... отлично
3

Поскольку ответы немного устарели, я поставлю свое решение (что сработало для меня), это может быть полезно для кого-то другого... Я принял свое решение из официальная документация Apache, без работы.

1/in gradle:

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

2/в остальной части приложения замените org.apache.http на cz.msebera.android.httpclient, и все ваши импорт (зависимости) будут исправлены. вы можете просто сделать ctrl + shift + R и заменить его во всем проекте.

3

FWIW удаление Apache-библиотеки было предварено некоторое время назад. Наш хороший друг Джесси Уилсон дал нам ключ к сведению в 2011 году: http://android-developers.blogspot.com/2011/09/androids-http-clients.html

Google перестала работать с ApacheHTTPClient некоторое время назад, поэтому любая библиотека, которая все еще полагается на нее, должна быть помещена в список устаревших библиотек, если только обновители не обновят свой код.

<rant> Я не могу сказать, сколько технических аргументов у меня было с людьми, которые настаивали на том, чтобы придерживаться HTTP-клиента Apache. Есть некоторые крупные приложения, которые собираются сломать, потому что менеджмент у моих не-названных предыдущих работодателей не слушал своих лучших инженеров или не знал, о чем они говорили, когда они игнорировали предупреждение... но, вода под мост.

Я выигрываю.

</rant>

  • 1
    Насколько я понимаю, Apache HttpClient скрыт в Android-23, но на самом деле не удаляется. Удаление может сломать множество существующих клиентов, нацеленных на более ранние платформы, где HttpClient не скрыт, и ожидается, что эти существующие приложения по-прежнему будут работать на Android-23. На android-23 добавление useLibrary служит для добавления этих унаследованных классов к загрузочному пути к классам, то есть к списку классов, предоставляемых платформой. Это, по сути, скрывает классы на Android-23.
  • 0
    Когда класс устарел, обычно сначала скрывают его, чтобы предотвратить его дальнейшее использование. Тогда это может быть удалено с течением времени. Примерно так: 1. пометить как устаревший в текущей версии. 2. спрятаться во второй версии. 3. Рефакторинг всего кода, чтобы полностью исключить старый класс.
2

Я решил эту проблему следующим образом:

1.) Задайте путь к классам в файле сборки верхнего уровня, о котором упоминалось в GUG:

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

2.) В файле сборки конкретного модуля:

android {
   useLibrary 'org.apache.http.legacy'
   compileSdkVersion 'android-MNC'
   buildToolsVersion '23.0.0 rc3'
}
0

это должно помочь:

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

Чтобы избежать недостающих ошибок ссылок, добавьте в зависимости

dependencies {
    provided 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'
}
  • 0
    или дайте компилировать вместо того, чтобы оба работали
  • 0
    с вышеуказанным конфигом, я встретился с ошибкой: (155, 0) Gradle DSL метод не найден: 'said ()'
0

Чтобы устранить проблемы, убедитесь, что вы используете средства сборки версии "23.0.0 rc2" со следующими инструментами: build gradle dependency:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню