Як використовувати застарілий клієнт Apache HTTP на Android Marshmallow?


76

Передумови

На Android Marshmallow Google повністю вилучив підтримку клієнта Apache HTTP (посилання тут ), оскільки він не має ефективної роботи порівняно з альтернативними версіями.

Це також може бути причиною того, що на 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"
    }

Коли я спробував, він скомпілювався нормально (помилок не відображається, і я міг запустити додаток proof-of-concept, оскільки в ньому немає спеціального коду), але коли я намагався використовувати деякі класи, я знаю, що є частиною старого API (наприклад, класу "HttpClient"), я бачу, що це не дозволяє мені цього робити.

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

Ось знімок екрана:

введіть тут опис зображення

Питання

Чому це відбувається? Чи правильно я ним користувався?


EDIT: повідомляв про цю проблему тут:

https://code.google.com/p/android/issues/detail?id=181474


під ним скомпільовано чудово, ви маєте на увазі градацію, синхронізовану чудово, або ви отримуєте ClassNotFoundException під час виконання?
Blackbelt

Чи можете ви опублікувати знімок екрана android studioat
DevUt

@Blackbelt Я маю на увазі, що до того моменту, коли я писав класи, які передбачається підтримувати, він міг бути скомпільований та запущений чудово (оскільки тут нема чим його використовувати). Не може бути жодного ClassNotFoundException, оскільки я їх поки не використовую. Тільки коли я намагаюся використовувати класи, які мають бути там, я не можу. Це не дозволяє мені цього робити і не пропонує мені необхідного імпорту.
розробник android

@ user4847410 Знімок екрану чого саме? Спроба застосувати імпорт силою призведе до того, що він не буде визнаний. і використовуючи клас, який існує там, це теж робить. У будь-якому випадку, я оновив запитання, щоб показати поточну ситуацію, яка цілком мінімальна ...
розробник android

Перевірте, чи використовуєте ви останню бета-версію gradle. залежності {classpath 'com.android.tools.build:gradle:1.3.0'} Здається, що щось не вистачає після версії (тобто '-beta' або щось інше). Використання останньої бета-версії вирішило це для мене
milosmns

Відповіді:


93

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 видалив підтримку клієнта Apache HTTP.


2
Працював у мене. Мені довелося додати Jar як бібліотеку до мого модуля програми, щоб позбутися помилок Android Studio щодо HttpClient тощо.
Юрген 'Кашбан' Валманн

1
Я отримую проблеми з Proguard, коли включаю org.apache.http.legacy.jar: IOExcpetion: Can't write [path to classes.jar] (Can't read [path to libs/org.apache.http.legacy.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [org.apache.http.legacy.jar:org/apache/commons/codec/binary/Hex.class]))Хтось ще використовує Proguard? Будь-які ідеї?
ashughes

1
Дуже прикро, що Google вирішив використати хакерство, що вимагає від людей додавати двійковий файл до свого проекту, а не публікувати http-legacy в артефактному репо. Я думав, що ми залишили цей анти-шаблон позаду 10 років тому.
Вільям

1
Ви Геній, сер.
активність

1
Це все ще не працювало для мене навіть після цього. Будь-який можливий діагноз, будь ласка @CoPLaS
Лакшмі Нараянан

9

useLibrary 'org.apache.http.legacy' у мене не працював, поки я не оновив версію інструментів Gradle у своєму основному файлі build.gradle мого проекту Android Studio, як показано нижче:

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

Дуже дякую! будь-яка ідея, чому лише ця зміна вирішує проблему?
Shirane85

Очевидно, директива useLibrary була додана до Gradle досить недавно, тому потрібно використовувати нову версію, як я вже говорив вище.
Джеймі Холл,

У мене це є у головному файлі gradle: classpath 'com.android.tools.build:gradle:1.0.0-rc2' Тож чи слід це видалити та додати рядок або зберегти обидва рядки, і це буде працювати без проблем
Sagar Devanga

Видаліть це та додайте вищезазначене.
Джеймі Холл,

9

Тут ідеальне рішення, запустивши просту перевірку шляху до файлу. запустивши

   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/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/android.jar /Users/"yourname"/Development/android-sdk-macosx/platforms/android-MNC/optional/org.apache .http.legacy.jar

Отже, баночка є. З якоїсь причини вона не була додана до проекту. але ви завжди можете додати його вручну, я думаю.


1
Я не розумію. Що це за код, який ви написали? Ви маєте на увазі, що мені слід шукати цю банку та додати її до проекту. Будь ласка, поясніть.
розробник android

Так, ти маєш рацію. Я написав цей код у build.gradle згідно з положенням android. Саме те, що я кажу, банку не піднімали автоматично. Можливо, вам потрібно додати його вручну
WenChao

Що робить код? Це справді потрібно? Крім того, ви це перевіряли? Чи добре це працює?
розробник android

Ні, він просто друкує шлях до файлу. не робить нічого вигадливого, його можна безпечно видалити. Ця банка містить усе від старої банки apache (HttpClient, Log тощо), я гадаю, вона буде працювати нормально.
WenChao

добре, дякую. сподіваюся, що це мені не знадобиться, коли прийде час. Перевірте ще раз, якщо / коли це потрібно. Наразі ви отримуєте +1 за зусилля.
розробник android

6

Після багатьох неприємних годин працювали:

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

Відповідь вище просто допомагає запускати збірки налагодження та випускати збірки, які використовують gradle.

Вставте це всередину тегу програми у файл маніфесту у всіх екземплярах проекту, що використовує застарілі класи Apache:

<uses-library android:name="org.apache.http.legacy" android:required="false" />

Це допомагає тим, хто все ще використовує сценарії Eclipse та ant під час компіляції.


2

Я знаю, що це дурна причина, але в списку спробуйте ...

Нещодавно я зіткнувся з цією проблемою, і вона спричинена обмеженням довжини шляху, я вважаю, що максимум 256 символів.

Перемістіть свій проект, і збірка буде успішною. Сподіваюся, ця робота для вас.


це не безглуздо ... це відповідь, яка спрацювала в моєму випадку ... Останні 36 годин я провів, намагаючись все на землі, крім цього .. На початку це звучить безглуздо, тому я не сприймав це серйозно ..
KawaiKx

Хлопці, спробуйте і це ... Це справді спрацювало для мене, де все інше не вдалося
KawaiKx

мені приємно. @ KawaiKx
Arpit Patel

2

Спадкова бібліотека Apache, розташована в

[ANDROID_SDK]\platforms\android-23\optional\org.apache.http.legacy.jar 

Тож ви можете скопіювати його всередині своїх бібліотек проекту або просто використовувати

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


2

Спочатку потрібно перевірити це у вашій папці 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

Також перевірте зовнішню бібліотеку


1

Увімкніть це в sdk / platform / android-23 / optional / optional.json

[
  {
    "name": "org.apache.http.legacy",
    "jar": "org.apache.http.legacy.jar",
    "manifest": false
  }
]

0

Видалити

useLibrary 'org.apache.http.legacy' 

з build.gradle, і я також додав цей рядок до свого файлу app.gradle

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

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

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

Відповідь CoPLaS виправила мої проблеми.


2
Тоді просто проголосуйте за відповідь CoPLaS, замість того, щоб відтворювати її тут!
Лео підтримує Моніку Челліо

0

Як використовувати застарілий клієнт Apache HTTP на Android Marshmallow?

Щоб продовжити використання класів Apache HTTP для API 23+:

Перш за все, не забудьте додати gradle dependencie у build.gradlef

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

0

Простий спосіб вирішити цю проблему - платформи C: \ Users \ username \ AppData \ Local \ Android \ sdk \. Тут видаліть свій android-23 і з диспетчера SDK знову оновіть ваш API 23. Це вирішить вашу проблему.

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