Android Gradle Apache HttpClient nie istnieje?

263

Próbuję przekonwertować projekt IntelliJ do systemu Gradle w Android Studio, ale mam problemy z Apache HttpClient? Czy coś pomijam, otrzymuję następujące błędy:

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

Mój plik build.gradle ma następujące zależności:

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

Wygląda na to, że wiele osób ma podobny problem, ale ani SO, ani Google nie mają rozwiązania, więc mam nadzieję, że to pytanie pomoże przyszłym wyszukiwarkom.

Ap
źródło

Odpowiedzi:

39

Sugeruję zastąpienie przestarzałego serwera Apache HttpClient nowym HttpURLConnection.

To czystsze rozwiązanie, migracja jest dość łatwa i ogólnie lepiej trzymać się najnowszych zmian SDK niż próbować włamać się / załatać / obejść: zwykle żałujesz później :)

Krok 1

HttpGet httpGet = new HttpGet(url);

staje się:

URL urlObj = new URL(url);

Krok 2

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

staje się:

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

Krok 2 bis

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

staje się:

int status = urlConnection.getResponseCode();
Benjamin Piette
źródło
Hej @Benjamin, jak wysłać URL metodą PUT?
Dharma Sai Seerapu
@TrickySolutions Przepraszamy, nie mam pojęcia, nie użyłem jeszcze metody PUT.
Benjamin Piette,
521

jeśli używasz docelowego SDK jako 23, dodaj poniższy kod w swoim build.gradle

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

i zmień skrypt na

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

Aby uzyskać więcej informacji, kliknij ten link

Jinu
źródło
7
zmień skrypt budowniczy na classpath 'com.android.tools.build:gradle:1.3.0'
Jinu
3
Już miał 1.3.1. Nadal nie można rozwiązać klas w 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
A jeśli chcesz korzystać z najnowszej wersji komponentów HTTP Apache?
russellhoff,
2
Thanx Jinu, aktualizacja Androida Studio z 1.3 do powyższej wersji jest konieczna. Mam to działa
mithil1501
94

Miałem ten problem, a następnie znalazłem te strony: Tutaj możesz zobaczyć, że biblioteka Apache jest przestarzała, ale nie została usunięta, więc powinna działać. Tak nie jest.

Zobaczyć .

Tutaj możesz zobaczyć, jak dołączyć bibliotekę Apache do swojego projektu

Zobaczyć .

Rozwiązałem problem, dodając następujące polecenie do mojego pliku build.gradle zgodnie z zaleceniami w drugim łączu.

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

Działa to jednak tylko wtedy, gdy używasz stopnia 1.3.0-beta2 lub nowszego, więc musisz dodać to do zależności buildscript, jeśli korzystasz z niższej wersji:

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

Mam nadzieję że to pomoże.

Milos Savanovic
źródło
Dla mnie nie powiodło się: Błąd: Wykonanie nie powiodło się dla zadania „: xenoAmp: mergeDebugJavaResources”. > Nie można określić folderu rozszerzenia dla L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENCJA z folderami L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ sourceFolderJavaResources \ debug, L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \
packagedJarsJavaResources
@ssuukk Cześć, znalazłeś rozwiązanie tego błędu?
CeccoCQ,
2
Niestety rozwiązaniem była zmiana celu na bieżący najwyższy interfejs API, co złamało wiele rzeczy! Następnie musiałem dodać „useLibrary”, „classpath” PLUS referencyjne starsze biblioteki apache lib, jak opisano w innym miejscu tego pytania. Po ponownej kompilacji postanowiłem po prostu całkowicie zrzucić kod Apache i zastąpić go wszystkim URLConnection, co było łatwiejsze niż myślałem.
ssuukk
Zgadzam się z ssuukk. Żadna z tych odpowiedzi nie działała dla mnie, więc ostatecznie pozbyłem się również bibliotek Apache. Jestem całkiem nowy w tworzeniu Androida, ale było to proste.
John81,
Miałem ten sam problem i naprawiłem za pomocą useLibrary „org.apache.http.legacy”, jak powiedział Milos ... jednak w przypadku @ssuukk z twoim problemem możesz spróbować dodać to zawsze: android {packageOptions {wyklucz „META-INF / LICENCJA „wyklucz” META-INF / ZALEŻNOŚCI ”wyklucz„ META-INF / UWAGA ”wyklucz„ META-INF / NOTICE.txt ”wyklucz„ META-INF / MANIFEST ”}}
Alexiscanny
53

Dodaj tę bibliotekę do build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Darshan Dhoriya
źródło
czy ktoś może to wyjaśnić? Dlaczego to sprawia, że ​​działa? Dlaczego musimy dodać tę linię oprócz dodawania zależności?
Dan
2
@ Czy to dlatego, że biblioteka org.apache.http została usunięta w wersji 23.
eltiare
Aby to wyjaśnić, nie wchodzi to do katalogu głównego build.gradle, ale raczej do folderu modułu, który
budujesz
37

kopia, org.apache.http.legacy.jarktóra jest wAndroid/Sdk/platforms/android-23/optional folderu doapp/libs

a także dodał tę linię do pliku app.gradle

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

Ale jeśli używasz większej liczby bibliotek jar, możesz skorzystać z tej metody

compile fileTree(dir: 'libs', include: ['*.jar'])
do01
źródło
2
W innym z moich projektów była to jedyna odpowiedź, która zadziałała, więc +1 i dzięki.
Apqu
dlaczego to nie jest odpowiedź?
dibble
1
Dla mnie to samo. Ktoś powinien zaakceptować tę odpowiedź zamiast tej, która została teraz zaakceptowana.
Ivan Fazaniuk
Jest to najmniejsza ścieżka oporu, nie jestem pewien, czy chcę obniżyć ocenę. Kompiluje się dobrze dla mnie.
Ed Manners,
Dzięki! Działa to z wtyczką gradle-experimental 0.6.0-alpha5. Wydaje się, że „useLibrary” nie istnieje we wtyczce eksperymentalnej.
monkey0506
14

Zasadniczo wszystko, co musisz zrobić, to dodać:

useLibrary  'org.apache.http.legacy'

Do twojego build.gradlepliku.

ATechPerson
źródło
9

Natrafiłem na ten sam problem. Odpowiedź Daniela Nugenta nieco pomogła (po zastosowaniu jego rady HttpResponseznaleziono - ale HttpClientnadal jej brak).

Oto, co mnie naprawiło:

  1. (jeśli nie zostało to jeszcze zrobione, polecam poprzednie wyciągi z importu)
  2. odwiedź http://hc.apache.org/downloads.cgi
  3. uzyskać 4.5.1.zip z sekcji binarnej
  4. rozpakuj go i wklej httpcore-4.4.3ihttpclient-4.5.1.jar wproject/libs folderze
  5. kliknij słoik prawym przyciskiem myszy i wybierz Dodaj jako bibliotekę .

Mam nadzieję, że to pomoże.

Martin Pfeffer
źródło
9

Wystąpiły podobne problemy, być może uda ci się sprawić, że zadziała przy użyciu podobnej metody.

Najpierw spróbuj tego z bieżącą konfiguracją, wyklucz httpclientz 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'
} 

W moim przypadku naprawiłem to za pomocą następujących słoików:

Następnie w build.gradle, wyłączając httpclientz 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
źródło
Dzięki za odpowiedź, obawiam się, że żadne z nich nie działało dla mnie :(
Apqu
@tur to dziwne, druga opcja działała dla mnie. Upewnij się, że stare pliki jar zostały usunięte dla drugiej opcji.
Daniel Nugent,
Do czego służy libs/core.jar?
IgorGanapolsky
7

Doskonała odpowiedź Jinu i Daniela

Dodając do tego, rozwiązałem problem za pomocą tego, jeśli Twoja kompilacjaSdkVersion ma 19 (W MOIM PRZYPADKU)

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'

w przeciwnym razie, jeśli Twój compileSdkVersion ma 23 lata, użyj

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
źródło
5

To właśnie zrobiłem i działa dla mnie.

krok 1: dodaj to w build.grade (moduł: aplikacja)

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

krok 2: zsynchronizuj projekt i gotowe.

NOT_A_PROGRAMMER
źródło
Czy jest jakiś powód do głosowania w dół?
NOT_A_PROGRAMMER
nie udało się rozwiązać z błędem „Nie można rozwiązać: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2”. Używam eksperymentalnej klasy 0.6.0-beta. potrafisz to rozgryźć?
RoFF
1

Wersja klienta HTTP Apache dostępna na standardowym Androidzie była bardzo stara .

Google Android 1.0 został wydany z migawką Apache HttpClient sprzed wersji BETA. Aby zbiegać się z pierwszą wersją Androida, interfejsy API Apache HttpClient 4.0 musiały zostać przedwcześnie zamrożone, podczas gdy wiele interfejsów i struktur wewnętrznych wciąż nie zostało w pełni opracowanych. W miarę dojrzewania Apache HttpClient 4.0 projekt oczekiwał od Google wprowadzenia najnowszych ulepszeń kodu do drzewa kodu. Niestety tak się nie stało.

Podczas mogli nadal używać starej przestarzałej biblioteki poprzez useLibrary 'org.apache.http.legacy'obejście (sugerowane przez @Jinu i innych), to naprawdę trzeba zacisnąć zęby i aktualizacji na coś innego, na przykład rodzimy Android HttpUrlConnection, lub jeśli nie spełnia Twoich potrzeb, możesz użyć biblioteki OkHttp , która i tak HttpUrlConnectionjest wewnętrznie oparta .

OkHttp faktycznie ma warstwę kompatybilności, która korzysta z tego samego interfejsu API co klient Apache, chociaż nie implementują wszystkich tych samych funkcji, więc przebieg może się różnić.

Chociaż możliwe jest zaimportowanie nowszej wersji klienta Apache (zgodnie z sugestią @MartinPfeffer), prawdopodobnie większość klas i metod, z których korzystałeś wcześniej, została uznana za przestarzałą i istnieje duże ryzyko, że aktualizacja wprowadzi błędy w twoim kodzie (na przykład znalazłem niektóre połączenia, które wcześniej działały zza proxy nie działały już), więc nie jest to świetne rozwiązanie.

Tim Rae
źródło
1

Po spędzeniu dni na tym temacie udało mi się go w końcu rozwiązać. Niestety potrzebujemy go, jeśli chcemy korzystać z plików rozszerzeń. Rozwiązanie zostało dostarczone przez kilka osób tutaj, ale dla mnie brakowało kilku drobnych szczegółów, które mogłyby zaoszczędzić mi dużo czasu. Oto sekwencja wydarzeń dla nowicjuszy takich jak ja, aby zaoszczędzić Twój cenny czas.

Najpierw zaimportowałem folder „biblioteki” z D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing do projektu, przechodząc do opcji Plik, Nowy, Importuj moduł i przechodząc do folderu „biblioteka”. Jeśli otworzysz Menedżera SDK i klikniesz „Uruchom samodzielnego Menedżera SDK” na dole wyskakującego okienka, możesz najechać wskaźnikiem myszy na folder „Dodatki” na dole, a mała żółta informacja powie ci, gdzie znajdziesz pakiet, który musisz zaimportować.

Po wykonaniu tej czynności przejdź do sekcji „biblioteka” w lewym okienku z „Projektem”, a w niej otwórz kartę „Android”. Otwórz sekcję java biblioteki i otwórz klasę APKExpansionPolicy. Jeśli masz błędy i import org.apache.http.NameValuePair i import org.apache.http.client.utils.URLEncodedUtils są jasnoszare, otwórz build.gradle (Projekt: cokolwiek) i upewnij się, że w „buildscript” w „zależnościach” znajduje się „ścieżka klasy” com.android.tools.build:gradle:1.5.0 ”. 1.5.0 może się różnić w twoim przypadku. Myślę, że to zależy od twojej wersji Studio. Mój to 1.5.1. Jeśli twój jest nowszy, pojawi się przypomnienie o aktualizacji numerów.

Następnie przejdź do „build.gradle (Module: library) i dołącz„ useLibrary ”org.apache.http.legacy” do sekcji „android”. Synchronizuj teraz (prawy górny róg) powinien być oferowany. Zrób to.

Jeśli pojawią się kolejne komunikaty o błędach (nie wiedziałbym tego, ponieważ zrobiłem to na odwrót), w twoim projekcie mogą brakować plików Apache, ponieważ apache nie jest już obsługiwany. Znajdź je w C / D: Users / Yourname / AppData / Local / Android / Sdk / platform / android-23 / opcjonalnie i skopiuj / wklej je do folderu projektu / aplikacji / libs. Powinieneś mieć tam plik opcjonalny.json i org.apache.http.legacy.jar. Lepiej pójdź na stronę apache i pobierz najnowszą wersję: http://hc.apache.org/downloads.cgi Rozpakuj go gdziekolwiek chcesz, otwórz go, przejdź do „lib”, skopiuj httpclient-4.5.1 .jar i zastąp go plikiem org.apache.http.legacy.jar.

Zsynchronizuj i przebuduj / wyczyść swój projekt. Warto zacząć.

Na wszelki wypadek otwórz terminal (L / H na dole Android Studio) i wpisz „gradlew clean”. Zainstaluje kilka rzeczy. Po zakończeniu wpisz „gradlew asemble”. Ukończenie zajmie kilka minut, ale da ci błędy, jeśli tak, oczywiście. Jeśli nie możesz wpisać niczego w terminalu, uruchom wiersz polecenia (przycisk Windows + R), wpisz cmd, naciśnij OK, kliknij prawym przyciskiem myszy tytuł małego czarnego wyskakującego ekranu (C: \ WINDOWS \ system32 \ cmd.exe) , Właściwości, Opcje, w dolnej części okna sprawdź, czy „Użyj starszej konsoli” jest pogrubiony. Uruchom ponownie A.Studio.

Powodzenia!

Immy
źródło
1

Musiałem pisać, ponieważ żadna z powyższych odpowiedzi nie działała dla mnie całkowicie.

Korzystam z Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Krok 1: Pobierz ostatni plik jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Krok 2: Skopiuj wklej plik .jar do folderu libs (utwórz, jeśli jeszcze nie istnieje) w swoim module (może to być aplikacja lub biblioteka)

Krok 3: Kliknij słoik prawym przyciskiem myszy i wybierz opcję „Dodaj jako bibliotekę”. Automatycznie doda plik jar jako zależność w pliku stopni twojego modułu

Krok 4: Teraz automatycznie twój problem zostanie rozwiązany, ale jeśli używasz proguard w swojej aplikacji, wyświetli ostrzeżenie o zduplikowanych plikach klas i nie pozwoli ci budować. Jest to znany błąd i należy dodać następujące zasady do reguł proguard

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

Powodzenia!

Debasish Mitra
źródło
0

W moim przypadku zaktualizowałem jedną z moich bibliotek w moim projekcie na Androida.

Używam Reservoir jako rozwiązania pamięci podręcznej: https://github.com/anupcowkur/Reservoir

Wyszedłem z:

compile 'com.anupcowkur:reservoir:2.1'

Do:

compile 'com.anupcowkur:reservoir:3.1.0'

Autor biblioteki musiał usunąć bibliotekę commons-io z repozytorium, aby moja aplikacja przestała działać.

Musiałem ręcznie dołączyć commons-io, dodając to do gradle:

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

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

Szymon
źródło