Як використовувати застарілий клієнт 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.