Làm cách nào để sử dụng ứng dụng Apache HTTP cũ trên Android Marshmallow?


76

Lý lịch

Trên Android Marshmallow, Google đã loại bỏ hoàn toàn sự hỗ trợ của Apache HTTP client (liên kết tại đây ) vì nó không có hiệu suất tốt so với các lựa chọn thay thế.

Đây cũng có thể là nguyên nhân dẫn đến rất nhiều ứng dụng bị lỗi trên Android Marshmallow.

Vấn đề

Google cho phép bạn vẫn sử dụng API này, không phải là API tích hợp sẵn, bằng cách thêm dòng này vào tệp gradle:

useLibrary 'org.apache.http.legacy'

Vì vậy, đây là những gì tôi đã làm:

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

Và:

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"
    }

Khi tôi thử nó, nó biên dịch tốt (không có lỗi nào được hiển thị và tôi có thể chạy ứng dụng bằng chứng khái niệm, vì nó không có bất kỳ mã đặc biệt nào), nhưng khi tôi thử sử dụng một số lớp mà tôi biết rằng là một phần của API cũ (như lớp "HttpClient"), tôi thấy rằng nó không cho phép tôi làm như vậy.

Tôi biết không nên sử dụng giải pháp này, nhưng chúng tôi phải có ứng dụng sẵn sàng hoạt động ở đó ít nhất là tạm thời, cho đến khi chúng tôi làm việc 100% trên tất cả những thứ sẽ thay đổi đối với Android Marshmallow và chúng tôi không muốn bất ngờ trong hình thức va chạm.

Đây là ảnh chụp màn hình:

nhập mô tả hình ảnh ở đây

Câu hỏi

Tại sao nó xảy ra? Tôi đã sử dụng nó một cách chính xác?


EDIT: đã báo cáo về vấn đề này ở đây:

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


bởi nó được biên dịch tốt, bạn có nghĩa là bạn đã đồng bộ hóa gradle tốt hay bạn đang nhận được ClassNotFoundException trong thời gian chạy?
Blackbelt

Bạn có thể gửi một số ảnh chụp màn hình của studioat android
DevUt

@Blackbelt Ý tôi là cho đến thời điểm tôi đã viết các lớp được cho là được hỗ trợ, nó có thể được biên dịch và chạy tốt (vì không có gì để sử dụng nó). Không thể có bất kỳ ClassNotFoundException nào, vì tôi chưa sử dụng chúng. Chỉ khi tôi cố gắng sử dụng các lớp được cho là có ở đó, tôi không thể. Nó không cho phép tôi làm như vậy và nó không cung cấp cho tôi những thứ cần thiết.
nhà phát triển android

@ user4847410 Ảnh chụp màn hình chính xác là gì? Cố gắng thực hiện nhập khẩu bằng vũ lực sẽ dẫn đến việc nó không được công nhận. và sử dụng một lớp tồn tại ở đó cũng làm được. Dù sao, tôi đã cập nhật các câu hỏi để cho thấy tình hình hiện nay, đó là khá tối thiểu ...
nhà phát triển Android

Kiểm tra xem bạn có đang sử dụng gradle beta mới nhất hay không. phụ thuộc {classpath 'com.android.tools.build:gradle:1.3.0'} Có vẻ như một cái gì đó bị thiếu sau phiên bản (tức là '-beta' hoặc cái gì đó). Sử dụng các phiên bản beta mới nhất giải quyết nó cho tôi
milosmns

Câu trả lời:


93

Android Studio phàn nàn rằng org.apache.httpcác lớp học như

org.apache.http.NameValuePair
org.apache.http.client.utils.URLEncodedUtils

đã mất tích.

Vì vậy, tôi đã thêm org.apache.http.legacy.jarcái nào trong Android/Sdk/platforms/android-23/optionalthư mục vàoapp/libs

Tôi cũng đã thêm dòng này vào app.gradletệp của mình

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

Nhưng nếu bạn đang sử dụng nhiều thư viện hơn, bạn có thể sử dụng cách này

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

Điều này đã giải quyết tất cả các lỗi của tôi gây ra vì google đã loại bỏ hỗ trợ của ứng dụng Apache HTTP.


2
Đã làm cho tôi. Tuy nhiên, tôi đã phải thêm Jar làm thư viện vào mô-đun ứng dụng của mình để loại bỏ các lỗi Android Studio về HttpClient, v.v.
Jürgen 'Kashban' Wahlmann

1
Tôi gặp sự cố Proguard khi đưa vào org.apache.http.legacy.jar: Có 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]))ai khác đang sử dụng Proguard không? Có ý kiến ​​gì không?
ashughes

1
Rất buồn khi Google đã chọn sử dụng một bản hack yêu cầu mọi người thêm một tệp nhị phân vào dự án của họ thay vì xuất bản di sản http vào một kho lưu trữ đồ tạo tác. Tôi nghĩ rằng chúng tôi đã bỏ lại khuôn mẫu chống đối đó cách đây 10 năm.
William

1
Ngài là Thiên tài, thưa ngài.
hoạt động

1
Nó vẫn không hoạt động cho tôi ngay cả sau này. Bất kỳ chẩn đoán có thể hài lòng @CoPLaS
Lakshmi Narayanan

9

useLibrary 'org.apache.http.legacy' không hoạt động với tôi cho đến khi tôi nâng cấp phiên bản công cụ Gradle trong tệp build.gradle chính của dự án Android Studio của tôi, như sau:

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

Cảm ơn rất nhiều! bất kỳ ý tưởng tại sao chỉ thay đổi này giải quyết vấn đề?
Shirane85

Rõ ràng chỉ thị useLibrary chỉ mới được thêm vào Gradle gần đây, vì vậy cần sử dụng phiên bản mới hơn như tôi đã nêu ở trên.
Jamie Hall

Tôi có cái này trong tệp gradle chính: classpath 'com.android.tools.build:gradle:1.0.0-rc2' Vì vậy, tôi có nên xóa cái này và thêm dòng của bạn hay giữ cả hai dòng và nó sẽ hoạt động mà không có vấn đề gì
Sagar Devanga

Loại bỏ cái đó và thêm cái ở trên.
Jamie Hall

9

Giải pháp hoàn hảo ở đây bằng cách chạy kiểm tra đường dẫn tệp đơn giản. bằng cách chạy

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

Bạn sẽ nhận được một cái gì đó như dưới đây

/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

Vậy là xong, cái lọ ở đó, vì lý do nào đó mà nó không được thêm vào dự án. nhưng tôi đoán bạn luôn có thể thêm nó theo cách thủ công.


1
Tôi không hiểu. Bạn đã viết mã này là gì? Ý bạn là tôi nên tìm kiếm cái lọ này và thêm nó vào dự án. Vui lòng giải thích.
nhà phát triển android

Vâng, bạn đúng. Tôi đã viết mã đó trong build.gradle theo mệnh đề android. Chính xác những gì tôi đang nói, cái lọ không tự động được nhấc lên. Có lẽ bạn cần phải thêm nó bằng tay
Wenchao

Mã làm gì? Nó có thực sự cần thiết không? Ngoài ra, bạn đã kiểm tra nó chưa? Nó có hoạt động tốt không?
nhà phát triển android

Không, nó chỉ in đường dẫn tệp. không làm bất cứ điều gì cầu kỳ, bạn có thể xóa nó một cách an toàn. Bình đó chứa mọi thứ từ bình apache cũ (HttpClient, Log, v.v.) Tôi cho rằng nó sẽ hoạt động tốt.
WenChao

ok, cảm ơn bạn. hy vọng rằng tôi sẽ không cần nó khi thời gian đến. Sẽ kiểm tra lại nếu / khi cần. Hiện tại, Bạn nhận được +1 cho nỗ lực.
nhà phát triển android

6

Sau nhiều giờ khó chịu, những điều sau đã hoạt động:

1. Xác định vị trí của jar apache. Nó sẽ nằm ở đâu đó như:

C:\Users\<yourname>\AppData\Local\Android\sdk\platforms\android-23\optional

2. Sao chép org.apache.http.legacy.jar vào thư mục libs của bạn.

Nhấp chuột phải vào libs -> dán hoặc sử dụng trình khám phá tệp của bạn để điều hướng đến thư mục libs trong dự án của bạn và dán.

Nếu bạn không có thư mục libs, như tôi đã làm, hãy tạo một dự án mới và nhập tất cả các tệp có liên quan vào vị trí tương ứng của chúng.

3. Bấm ok xem cái này

4. Bước quan trọng nhất: Nhấp chuột phải vào thư mục apache và chọn Add As Library. xem cái này

Hy vọng điều này sẽ giúp ai đó tiếp tục cuộc sống của họ.


5

Câu trả lời ở trên chỉ giúp các bản dựng gỡ lỗi chạy và phát hành các bản dựng đang sử dụng gradle.

Chèn cái này vào bên trong thẻ ứng dụng trên tệp kê khai, trên tất cả các phiên bản dự án sử dụng các lớp apache kế thừa:

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

Điều này giúp ích cho những người vẫn đang sử dụng Eclipse và các tập lệnh ant trong quá trình biên dịch.


2

Tôi biết đây là lý do ngớ ngẩn nhưng hãy thử xem ...

Tôi đã gặp sự cố này gần đây và nó là do giới hạn độ dài đường dẫn, tôi nghĩ nó tối đa là 256 ký tự.

Định vị lại Dự án của bạn và việc xây dựng sẽ thành công.


điều này không hề ngớ ngẩn ... đây là câu trả lời phù hợp với trường hợp của tôi ... 36 giờ qua tôi đã thử mọi thứ trên trái đất, ngoại trừ điều này .. Ban đầu nghe có vẻ ngớ ngẩn nên tôi đã không xem trọng nó ..
KawaiKx

Guys, hãy thử này ra quá ... Nó thực sự làm việc cho tôi, nơi mọi thứ khác đã thất bại
KawaiKx

đó là niềm vui của tôi. @ KawaiKx
Arpit Patel

2

Thư viện Apache kế thừa nằm trong

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

Vì vậy, bạn có thể sao chép nó vào bên trong dự án libs của bạn hoặc chỉ sử dụng

compile files("${android.getSdkDirectory().getAbsolutePath()}" + File.separator + "platforms" + File.separator + "android-23" + File.separator + "optional" + File.separator + "org.apache.http.legacy.jar")

trong /app/build.gradle của bạn


2

Trước tiên, bạn phải kiểm tra điều đó trong thư mục libs của mình

Đảm bảo trong Thư mục Libs Kiểm tra thư viện 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'
    }

Đây là tệp gradle của tôi

Cũng kiểm tra thư viện bên ngoài


1

Bật tính năng này trong sdk / platform / android-23 / option / option.json

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

0

Tẩy

useLibrary 'org.apache.http.legacy' 

từ build.gradle và tôi cũng đã thêm dòng này vào tệp app.gradle của mình

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

Nhưng nếu bạn đang sử dụng nhiều thư viện hơn, bạn có thể sử dụng cách này

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

Câu trả lời CoPLaS đã khắc phục sự cố của tôi.


2
Sau đó, chỉ cần ủng hộ câu trả lời CoPLaS thay vì sao chép nó ở đây!
Leo ủng hộ Monica Cellio,

0

Làm cách nào để sử dụng ứng dụng Apache HTTP cũ trên Android Marshmallow?

Để tiếp tục sử dụng các lớp Apache HTTP cho API 23+:

Trước hết, hãy chắc chắn thêm gradle dependencie vào build.gradlef

buildscript {

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

Sau đó, thêm tham chiếu bên trong build.gradledự án của bạn:

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

0

Một cách đơn giản để giải quyết vấn đề này là C: \ Users \ username \ AppData \ Local \ Android \ sdk \ platform. Tại đây, hãy xóa android-23 của bạn và khỏi trình quản lý SDK, hãy cập nhật lại API 23 của bạn. Nó sẽ giải quyết vấn đề của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.