Как использовать устаревший 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'
    ...
}