Android Gradle Apache HttpClient tidak ada?

263

Saya mencoba mengonversi proyek IntelliJ ke sistem Gradle Android Studio, tetapi saya mengalami kesalahan dengan Apache HttpClient? Apakah saya kehilangan sesuatu, kesalahan yang saya dapatkan adalah sebagai berikut:

Error:(10, 30) error: package org.apache.http.client does not exist
Error:(11, 30) error: package org.apache.http.client does not exist
Error:(12, 37) error: package org.apache.http.client.entity does not exist
Error:(13, 38) error: package org.apache.http.client.methods does not exist
Error:(14, 38) error: package org.apache.http.client.methods does not exist
Error:(15, 38) error: package org.apache.http.client.methods does not exist
Error:(16, 35) error: package org.apache.http.impl.client does not exist
Error:(134, 33) error: cannot find symbol class HttpUriRequest
Error:(164, 39) error: cannot find symbol class HttpUriRequest
Error:(106, 17) error: cannot find symbol class HttpGet
Error:(106, 39) error: cannot find symbol class HttpGet
Error:(117, 17) error: cannot find symbol class HttpPost
Error:(117, 40) error: cannot find symbol class HttpPost
Error:(125, 43) error: cannot find symbol class UrlEncodedFormEntity
Error:(135, 9) error: cannot find symbol class HttpClient
Error:(135, 33) error: cannot find symbol class DefaultHttpClient
Error:(155, 18) error: cannot find symbol class ClientProtocolException
Error:(165, 9) error: cannot find symbol class HttpClient
Error:(165, 33) error: cannot find symbol class DefaultHttpClient
Error:(185, 18) error: cannot find symbol class ClientProtocolException

File build.gradle saya memiliki dependensi berikut:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
    compile 'org.apache.httpcomponents:httpmime:4.2.6'
    compile files('libs/core.jar')
}

Tampaknya banyak orang mendapatkan masalah serupa tetapi SO atau Google tidak memiliki solusi, jadi saya berharap pertanyaan ini akan membantu para pencari di masa depan.

Apqu
sumber

Jawaban:

39

Saya sarankan Anda mengganti apache HttpClient yang sudah usang dengan HttpURLConnection baru.

Itu solusi yang lebih bersih, cukup mudah untuk dimigrasi, dan umumnya lebih baik tetap menggunakan perubahan SDK terbaru daripada mencoba meretas / menambal / menyelesaikan masalah: Anda biasanya menyesal nanti :)

Langkah 1

HttpGet httpGet = new HttpGet(url);

menjadi:

URL urlObj = new URL(url);

Langkah 2

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpResponse response = httpClient.execute(httpGet, localContext);
InputStream is = response.getEntity().getContent();

menjadi:

HttpURLConnection urlConnection = (HttpURLConnection) urlObj.openConnection();
InputStream is = urlConnection.getInputStream();

Langkah 2 bis

int status = response.getStatusLine().getStatusCode();

menjadi:

int status = urlConnection.getResponseCode();
Benjamin Piette
sumber
Hai @Benjamin, bagaimana cara mengirim URL dengan metode PUT?
Dharma Sai Seerapu
@TrickySolutions Maaf tidak tahu, belum menggunakan metode PUT.
Benjamin Piette
521

jika Anda menggunakan target SDK sebagai 23 tambahkan kode di bawah ini di build.gradle Anda

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

dan ubah skrip build Anda menjadi

classpath 'com.android.tools.build:gradle:1.3.0' 

untuk info lebih lanjut ikuti tautan ini

Jinu
sumber
7
ubah buildscript Anda menjadi classpath 'com.android.tools.build:gradle:1.3.0'
Jinu
3
Sudah punya 1.3.1. Masih tidak dapat menyelesaikan kelas di dalam Android Studio:Error:(14, 23) error: package org.apache.http does not exist
Henrique de Sousa
2
android studio 1.4 beta 2
Jinu
2
Dan bagaimana jika Anda ingin menggunakan versi terbaru dari komponen http apache?
russellhoff
2
Thanx Jinu, memperbarui Android Studio dari versi 1.3 ke di atas adalah keharusan. Mendapatkannya bekerja
mithil1501
94

Saya mengalami masalah ini dan kemudian menemukan halaman-halaman ini: Di ​​sini Anda dapat melihat bahwa pustaka apache sudah tidak digunakan lagi, tetapi itu tidak dihapus, jadi seharusnya sudah berfungsi. Tidak.

Lihat .

Dan di sini Anda dapat melihat cara memasukkan pustaka apache ke proyek Anda

Lihat .

Saya menyelesaikan masalah dengan menambahkan berikut ke file build.gradle saya seperti yang direkomendasikan di tautan kedua.

android {
    useLibrary 'org.apache.http.legacy'
}

Namun ini hanya berfungsi jika Anda menggunakan gradle 1.3.0-beta2 atau lebih tinggi, jadi Anda harus menambahkan ini ke dependensi buildscript jika Anda menggunakan versi yang lebih rendah:

classpath 'com.android.tools.build:gradle:1.3.0-beta2'

Semoga ini membantu.

Milos Savanovic
sumber
Bagi saya itu gagal dengan: Kesalahan: Eksekusi gagal untuk tugas ': xenoAmp: mergeDebugJavaResources'. > Tidak dapat menentukan folder ekspansi untuk L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE dengan folder L: \ Projekty \ xenoampgit \ xeno \ \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \
packageJarsJavaResources
@ susuuk Hai, apakah Anda menemukan solusi untuk kesalahan ini?
CeccoCQ
2
Sayangnya solusinya adalah mengubah target menjadi API tertinggi saat ini, dan itu menghancurkan banyak hal! Kemudian saya harus menambahkan "useLibrary", "classpath" PLUS legacy apache lib referensi, seperti yang dijelaskan di tempat lain dalam pertanyaan ini. Dan setelah itu dapat dikompilasi lagi, saya hanya memutuskan untuk membuang kode Apache sekaligus dan mengganti semuanya dengan URLConnection, yang lebih mudah dari yang saya kira.
ssuukk
Setuju dengan ssuukk. Tidak satu pun dari jawaban ini yang bekerja untuk saya, jadi saya akhirnya menyingkirkan perpustakaan Apache juga. Saya cukup baru dalam pengembangan Android, tetapi itu mudah.
John81
Saya memiliki masalah yang sama dan saya perbaiki dengan useLibrary 'org.apache.http.legacy' bagaimana kata Milos ... namun untuk @ssuukk dengan masalah Anda, Anda dapat mencoba menambahkan ini selalu: android {packagingOptions {tidak termasuk 'META-INF / LICENSE 'mengecualikan' META-INF / DEPENDENSI 'mengecualikan' META-INF / PEMBERITAHUAN 'mengecualikan' META-INF / NOTICE.txt 'mengecualikan' META-INF / MANIFEST '}}
Alexiscanny
53

Tambahkan perpustakaan ini ke dalam build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Darshan Dhoriya
sumber
dapatkah seseorang menjelaskan hal ini? Mengapa ini membuatnya bekerja? Mengapa kita perlu menambahkan baris ini, selain menambahkan dependensi?
Dan
2
@Dan itu karena pustaka org.apache.http dihapus dengan versi 23.
eltiare
Untuk memperjelas, ini tidak masuk ke root build.gradle, melainkan di dalam folder modul yang sedang Anda bangun (yaitu "aplikasi")
hamx0r
37

salin org.apache.http.legacy.jaryang ada di dalam Android/Sdk/platforms/android-23/optionalfolder keapp/libs

dan juga menambahkan baris ini ke file app.gradle

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

Tetapi jika Anda menggunakan lebih banyak perpustakaan jar, Anda bisa menggunakan cara ini

compile fileTree(dir: 'libs', include: ['*.jar'])
lakukan01
sumber
2
Di proyek saya yang lain ini terbukti satu-satunya jawaban yang berhasil jadi +1 dan terima kasih.
Apqu
mengapa bukankah ini jawabannya?
dibble
1
Sama untuk ku. Seseorang harus menerima jawaban ini daripada yang diterima sekarang.
Ivan Fazaniuk
Ini adalah jalur resistensi yang paling sedikit, tidak yakin saya ingin menurunkan kelas. Kompilasi itu baik untuk saya.
Ed Manners
Terima kasih! Ini bekerja dengan plugin 0.6.0-alpha5 gradle-eksperimental. "useLibrary" tampaknya tidak ada di plugin eksperimental.
monkey0506
14

Pada dasarnya yang perlu Anda lakukan adalah menambahkan:

useLibrary  'org.apache.http.legacy'

Ke build.gradlefile Anda .

ATechPerson
sumber
9

Saya mengalami masalah yang sama. Jawaban Daniel Nugent sedikit membantu (setelah mengikuti sarannya HttpResponseditemukan - tetapi HttpClientmasih hilang).

Jadi inilah yang diperbaiki untuk saya:

  1. (jika belum dilakukan, memuji pernyataan impor sebelumnya)
  2. kunjungi http://hc.apache.org/downloads.cgi
  3. dapatkan 4.5.1.zipdari bagian biner
  4. unzip dan tempel httpcore-4.4.3& httpclient-4.5.1.jardi project/libsfolder
  5. klik kanan tabung dan pilih Tambahkan sebagai perpustakaan .

Semoga ini bisa membantu.

Martin Pfeffer
sumber
9

Saya mengalami masalah serupa, Anda mungkin bisa membuatnya bekerja menggunakan metode yang serupa.

Pertama, coba ini dengan konfigurasi Anda saat ini, kecualikan httpclientdari httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile ('org.apache.httpcomponents:httpmime:4.2.6'){
            exclude module: 'httpclient'
        }
    compile 'org.apache.httpcomponents:httpclient:4.2.6'
} 

Dalam kasus saya, saya memperbaikinya dengan menggunakan stoples berikut:

Lalu, di build.gradle, tidak termasuk httpclientdari httpmime:

dependencies {
    compile 'com.google.android.gms:play-services:+'
    compile('org.apache.httpcomponents:httpmime:4.3.5') {
        exclude module: 'httpclient'
    }
    compile 'org.apache.httpcomponents:httpclient-android:4.3.5.1'
}
Daniel Nugent
sumber
Terima kasih atas jawaban Anda, saya takut tidak ada yang berhasil untuk saya :(
April
@tur itu aneh, opsi kedua bekerja untuk saya. Pastikan file jar lama Anda dihapus untuk opsi kedua.
Daniel Nugent
Untuk apa libs/core.jar?
IgorGanapolsky
7

Jawaban Sempurna oleh Jinu dan Daniel

Menambahkan ke ini saya memecahkan Masalah dengan Menggunakan Ini, jika compileSdkVersion Anda adalah 19 (DALAM KASUS SAYA)

compile ('org.apache.httpcomponents:httpmime:4.3'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile ('org.apache.httpcomponents:httpcore:4.4.1'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile 'commons-io:commons-io:1.3.2'

lain jika compileSdkVersion Anda adalah 23 maka gunakan

android {
useLibrary 'org.apache.http.legacy'
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    }
}
Sophia
sumber
5

Inilah yang saya lakukan, dan itu berhasil untuk saya.

langkah 1: tambahkan ini di build.grade (module: app)

compile 'org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2'

langkah 2: sinkronkan proyek dan selesai.

NOT_A_PROGRAMMER
sumber
Ada alasan untuk memilih?
NOT_A_PROGRAMMER
gagal menyelesaikan dengan kesalahan "Gagal menyelesaikan: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌t ent: 4.1.2". Saya menggunakan eksperimental gradle 0.6.0-beta. bisakah kamu mencari tahu?
RoFF
1

Versi klien HTTP Apache yang disediakan untuk Android sangat lama .

Google Android 1.0 dirilis dengan snapshot pra-BETA dari Apache HttpClient. Bertepatan dengan rilis Android pertama Apache HttpClient 4.0 API harus dibekukan secara prematur, sementara banyak antarmuka dan struktur internal masih belum sepenuhnya berfungsi. Ketika Apache HttpClient 4.0 jatuh tempo, proyek mengharapkan Google untuk memasukkan perbaikan kode terbaru ke dalam pohon kode mereka. Sayangnya itu tidak terjadi.

Meskipun Anda dapat terus menggunakan pustaka lama yang sudah usang melalui useLibrary 'org.apache.http.legacy'solusi (disarankan oleh @Jinu dan yang lain), Anda benar-benar perlu menggigit peluru dan memperbarui ke hal lain, misalnya Android asli HttpUrlConnection, atau jika itu tidak memenuhi kebutuhan Anda, Anda dapat menggunakan pustaka OkHttp , yang merupakan HttpUrlConnectionbasis internal .

OkHttp sebenarnya memiliki lapisan kompatibilitas yang menggunakan API yang sama dengan klien Apache, meskipun mereka tidak mengimplementasikan semua fitur yang sama, sehingga jarak tempuh Anda mungkin bervariasi.

Meskipun dimungkinkan untuk mengimpor versi yang lebih baru dari klien Apache (seperti yang disarankan oleh @MartinPfeffer), kemungkinan bahwa sebagian besar kelas dan metode yang Anda gunakan sebelumnya telah ditinggalkan, dan ada risiko yang cukup besar bahwa pembaruan akan memperkenalkan bug. dalam kode Anda (misalnya saya menemukan beberapa koneksi yang sebelumnya bekerja dari belakang proxy tidak lagi berfungsi), jadi ini bukan solusi yang bagus.

Tim Rae
sumber
1

Setelah menghabiskan waktu berhari-hari untuk masalah ini, akhirnya saya berhasil menyelesaikannya. Sayangnya kami membutuhkannya jika kami ingin menggunakan file ekspansi. Solusinya telah disediakan oleh beberapa orang di sini, tetapi bagi saya jawabannya hilang beberapa detail kecil yang bisa menghemat banyak waktu untuk saya. Berikut adalah urutan acara untuk pemula seperti saya untuk menghemat waktu berharga Anda.

Pertama saya mengimpor folder "library" dari D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing ke proyek dengan masuk ke File, New, Import Module dan menavigasi ke folder "library". Jika Anda membuka SDK Manager dan klik "Luncurkan Standalone SDK Manager" di bagian bawah layar sembulan, Anda dapat mengarahkan kursor ke folder "Ekstra" di bagian bawah dan info kuning kecil akan memberi tahu Anda di mana Anda akan menemukan paket yang perlu Anda impor.

Setelah itu selesai, pergi ke bagian "perpustakaan" di panel kiri dengan "Project" dan di dalamnya tab "Android" terbuka. Buka bagian java perpustakaan dan buka kelas APKExpansionPolicy. Jika Anda memiliki kesalahan dan import org.apache.http.NameValuePair dan import org.apache.http.client.utils.URLEncodedUtils berwarna abu-abu pucat, buka build.gradle (Proyek: apa pun) dan pastikan bahwa dalam "buildscript" di bawah "dependancies" Anda memiliki "classpath 'com.android.tools.build:gradle:1.5.0" termasuk. 1.5.0 mungkin berbeda dalam kasus Anda. Saya kira itu tergantung pada versi Studio Anda. Milik saya adalah 1.5.1. Jika milik Anda lebih baru, Anda akan diingatkan untuk memperbarui nomornya.

Setelah itu, buka "build.gradle (Module: library) dan sertakan" useLibrary 'org.apache.http.legacy' ke dalam bagian "android". Sinkronkan Sekarang (sudut atas R / H) harus ditawarkan. Lakukan.

Jika Anda mendapatkan pesan kesalahan lebih lanjut (saya tidak akan mengetahuinya karena saya melakukannya sebaliknya), file-file Apache mungkin hilang dari proyek Anda, karena apache tidak didukung lagi. Temukan mereka di C / D: Pengguna / NamaAnda / AppData / Lokal / Android / SDK / platform / android-23 / opsional dan salin / tempelkan ke folder proyek / app / libs Anda. Anda harus memiliki file opsional.json dan org.apache.http.legacy.jar di sana. Anda mungkin lebih baik pergi ke situs web apache dan memuat versi terbaru: http://hc.apache.org/downloads.cgi Buka ritsleting di mana pun Anda inginkan, buka, buka "lib", salin httpclient-4.5.1 File .jar dan ganti file org.apache.http.legacy.jar dengannya.

Sinkronkan dan bangun kembali / bersihkan proyek Anda dan itu harus baik untuk pergi.

Untuk berjaga-jaga, buka terminal Anda (L / H bawah Android Studio) dan ketik "gradlew clean". Ini akan menginstal beberapa hal. Setelah selesai, ketikkan "gradlew assemble". Ini akan memakan waktu beberapa menit untuk menyelesaikannya, tetapi itu akan memberi Anda kesalahan jika Anda memiliki tentu saja. Jika Anda tidak dapat mengetikkan apa pun di Terminal, jalankan command prompt (tombol Windows + R), ketik cmd, tekan OK, klik kanan pada judul layar popup hitam kecil (C: \ WINDOWS \ system32 \ cmd.exe) , Properties, Options, di bagian bawah jendela periksa apakah "Use legacy console" sudah kental. Mulai ulang A.Studio.

Semoga berhasil!

Immy
sumber
1

Saya harus memposting karena tidak ada jawaban di atas yang bekerja sepenuhnya untuk saya.

Saya menggunakan Android Studio

classpath 'com.android.tools.build:gradle:1.5.0'

compileSdkVersion 23
buildToolsVersion "23.0.3"

Langkah 1: Unduh file jar terbaru ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Langkah 2: Salin tempelkan file .jar ke folder libs (buat jika belum ada) di modul Anda (bisa berupa aplikasi atau pustaka)

Langkah 3: Klik kanan pada toples dan "Add as Library". Ini secara otomatis akan menambahkan file jar sebagai ketergantungan pada file gradle modul Anda

Langkah 4: Sekarang secara otomatis masalah Anda akan teratasi tetapi jika Anda menggunakan proguard di aplikasi Anda, itu akan memberi Anda peringatan tentang duplikat file kelas dan tidak akan membiarkan Anda membangun. Ini adalah bug yang dikenal dan Anda perlu menambahkan yang mengikuti aturan proguard Anda

-dontwarn org.apache.commons.**
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**

Semoga berhasil!

Debasish Mitra
sumber
0

Dalam kasus saya, saya memperbarui salah satu perpustakaan saya di proyek android saya.

Saya menggunakan Reservoir sebagai solusi penyimpanan cache saya: https://github.com/anupcowkur/Reservoir

Saya pergi dari:

compile 'com.anupcowkur:reservoir:2.1'

Untuk:

compile 'com.anupcowkur:reservoir:3.1.0'

Penulis perpustakaan harus menghapus perpustakaan commons-io dari repo sehingga aplikasi saya tidak lagi berfungsi.

Saya harus memasukkan commons-io secara manual dengan menambahkan ini ke gradle:

compile 'commons-io:commons-io:2.5'

https://mvnrepository.com/artifact/commons-io/commons-io/2.5

Simon
sumber