Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
Фон
В Android Marshmallow Google полностью удалил поддержку HTTP-клиента Apache (ссылка здесь), потому что это doesn Хорошая производительность по сравнению с альтернативами.
Это также может быть причиной того, что огромное количество приложений разбилось на Android Marshmallow.
Проблема
Google позволяет вам использовать этот API, а не как встроенный в него, добавив эту строку в файл gradle:
useLibrary 'org.apache.http.legacy'
Итак, это то, что я сделал:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
и
android {
compileSdkVersion 'android-MNC'
buildToolsVersion "23.0.0 rc3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.example.user.androidmtest"
minSdkVersion 'MNC'
targetSdkVersion 'MNC'
versionCode 1
versionName "1.0"
}
Когда я это пробовал, он скомпилировался отлично (никаких ошибок не показывалось, и я мог запускать приложение с доказательством концепции, так как у него нет специального кода), но когда я попытался использовать некоторые из классов, которые Я знаю, что это часть старого API (например, класса HttpClient), я вижу, что это не позволяет мне это делать.
Я знаю, что не рекомендуется использовать это решение, но мы должны иметь приложение, готовое работать там хотя бы временно, пока мы не будем работать на 100% на всех вещах, которые должны измениться для Android Marshmallow, и мы не хотим сюрпризы в виде сбоев.
Вот скриншот:
![введите описание изображения здесь]()
Вопрос
Почему это происходит? Правильно ли я использовал его?
ИЗМЕНИТЬ: сообщите об этом здесь:
https://code.google.com/p/android/issues/detail?id=181474
Ответы
Ответ 1
Android Studio жаловалась, что org.apache.http
классы, такие как
org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils
отсутствуют.
Итак, я добавил org.apache.http.legacy.jar
, который находится в
Android/Sdk/platforms/android-23/optional
с папкой app/libs
Я также добавил эту строку в мой app.gradle
файл
compile files('libs/org.apache.http.legacy.jar')
Но если вы используете больше библиотек, вы можете использовать этот способ
compile fileTree(dir: 'libs', include: ['*.jar'])
Это устранило все мои ошибки, которые были вызваны тем, что Google удалил поддержку HTTP-клиента Apache.
Ответ 2
useLibrary 'org.apache.http.legacy' не работал у меня, пока я не обновил версию инструментов Gradle в моем основном файле build.gradle моего проекта Android Studio, как показано ниже:
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
}
Ответ 3
Отличное решение здесь, запустив простую проверку пути файла.
запустив
android {
compileSdkVersion 'android-MNC'
buildToolsVersion "23.0.0 rc3"
useLibrary 'org.apache.http.legacy'
defaultConfig {
applicationId "com.example.user.androidmtest"
minSdkVersion 'MNC'
targetSdkVersion 'MNC'
versionCode 1
versionName "1.0"
}
getBootClasspath().each{File file ->
println file.absolutePath
}
}
}
Вы получите что-то вроде ниже
/Users/ "вашеимя" /Development/android -sdk-macosx/platforms/android-MNC/android.jar /Users/ "вашеимя" /Development/android -sdk-macosx/platforms/android-MNC/optional/org.apache.http.legacy.jar
Итак, вы идете, там есть банка. По какой-то причине это не добавилось в проект. но вы всегда можете добавить его вручную, я думаю.
Ответ 4
После многих неудачных часов работало:
1. Найдите банку apache.
Он должен находиться где-то вроде:
C:\Users\<yourname>\AppData\Local\Android\sdk\platforms\android-23\optional
2. Скопируйте org.apache.http.legacy.jar
в папку libs.
Или щелкните правой кнопкой мыши на libs → paste или используйте файл-проводник, чтобы перейти в папку libs вашего проекта и вставить.
Если у вас нет папки libs, как и я, создайте новый проект и импортируйте все соответствующие файлы в соответствующие места.
3. Нажмите ok
см. это
4. Самый важный шаг: щелкните правой кнопкой мыши папку apache и выберите Add As Library
.
см. это
Надеюсь, это поможет кому-то продолжить свою жизнь.
Ответ 5
Библиотека Legacy Apache, расположенная в
[ANDROID_SDK]\platforms\android-23\optional\org.apache.http.legacy.jar
Итак, вы можете скопировать его внутри проекта libs или просто использовать
compile files("${android.getSdkDirectory().getAbsolutePath()}" + File.separator + "platforms" + File.separator + "android-23" + File.separator + "optional" + File.separator + "org.apache.http.legacy.jar")
в /app/build.gradle
Ответ 6
Я знаю, что это глупая причина, но в списке попробуйте...
Недавно я столкнулся с этой проблемой, и это вызвано ограничением длины пути. Я думаю, что он имеет максимум 256 символов.
Переместите свой проект, и сборка будет успешной. Надейтесь на эту работу для вас.
Ответ 7
Сначала вы должны проверить, что в папке libs
![Убедитесь, что в папке Libs проверьте, что библиотека apache]()
Then add into your gradle file like this
android {
compileSdkVersion 23
buildToolsVersion '23.0.2'
defaultConfig {
applicationId "info.tranetech.laundry"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
android {
useLibrary 'org.apache.http.legacy'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:23.0.1
compile 'com.android.support:design:23.0.1
testCompile 'junit:junit:4.12'
compile files('libs/android-async-http-1.4.4.jar')
compile 'com.google.android.gms:play-services:8.4.0'
}
![Это мой gradle файл]()
![Также проверьте внешнюю библиотеку]()
Ответ 8
Ответ выше просто помогает запускать отладочные сборки и выпускает сборки, которые используют gradle.
Вставьте это внутри тега приложения в файл манифеста во всех экземплярах проекта, которые используют устаревшие классы apache:
<uses-library android:name="org.apache.http.legacy" android:required="false" />
Это помогает тем, кто все еще использует сценарии Eclipse и ant во время компиляции.
Ответ 9
Включить это в sdk/platform/android-23/optional/optional.json
[
{
"name": "org.apache.http.legacy",
"jar": "org.apache.http.legacy.jar",
"manifest": false
}
]
Ответ 10
Простым способом решения этой проблемы является C:\Users\username\AppData\Local\Android\sdk\platform. Здесь удалите ваш android-23 и от менеджера SDK обновите свой API 23 снова. Это решит вашу проблему.
Ответ 11
Удалить
useLibrary 'org.apache.http.legacy'
из build.gradle, и я также добавил эту строку в мой файл app.gradle
compile files('libs/org.apache.http.legacy.jar')
Но если вы используете больше библиотек, вы можете использовать этот способ
compile fileTree(dir: 'libs', include: ['*.jar'])
Ответ CoPLaS устраняет мои проблемы.
Ответ 12
Как использовать устаревший HTTP-клиент Apache на Android Marshmallow?
Чтобы продолжить использование HTTP-классов Apache для API 23 +:
Прежде всего, обязательно добавьте зависимость gradle в build.gradle
f
buildscript {
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
}
}
Затем добавьте ссылку внутри build.gradle
вашего проекта:
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
useLibrary 'org.apache.http.legacy'
...
}