O Android Gradle Apache HttpClient não existe?

263

Estou tentando converter um projeto IntelliJ no sistema Gradle do Android Studio, mas estou com erros no Apache HttpClient? Estou faltando alguma coisa, os erros que estou recebendo são os seguintes:

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

Meu arquivo build.gradle possui as seguintes dependências:

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

Parece que muitas pessoas estão tendo um problema semelhante, mas nem o SO nem o Google têm uma solução, então espero que essa pergunta ajude os futuros pesquisadores.

Apqu
fonte

Respostas:

39

Sugiro que você substitua o HttpClient apache descontinuado pelo novo HttpURLConnection.

Essa é uma solução mais limpa, é muito fácil migrar e, geralmente, é melhor manter as alterações mais recentes do SDK do que tentar hackear / corrigir / solucionar o problema: você geralmente se arrepende mais tarde :)

Passo 1

HttpGet httpGet = new HttpGet(url);

torna-se:

URL urlObj = new URL(url);

Passo 2

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

torna-se:

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

Etapa 2 bis

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

torna-se:

int status = urlConnection.getResponseCode();
Benjamin Piette
fonte
Hey @Benjamin, como enviar URL com o método PUT?
Dharma Sai Seerapu 03/02
@TrickySolutions Desculpe, não faço ideia, ainda não usei o método PUT.
Benjamin Piette
521

se você estiver usando o sdk de destino como 23, adicione o código abaixo em seu build.gradle

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

e mude seu buildscript para

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

para mais informações siga este link

Jinu
fonte
7
altere seu buildscript para classpath 'com.android.tools.build:gradle:1.3.0'
#
3
Já tinha 1.3.1. Ainda não é possível resolver classes dentro do 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
E se você quiser usar a versão mais recente dos componentes http do apache?
russellhoff
2
Thanx Jinu, é necessário atualizar o Android Studio da versão 1.3 para a versão anterior. Tenho que trabalhar
mithil1501
94

Eu tive esse problema e encontrei estas páginas: Aqui você pode ver que a biblioteca do apache está obsoleta, mas não foi removida, portanto deve funcionar. Não faz.

Veja .

E aqui você pode ver como incluir a biblioteca apache no seu projeto

Veja .

Resolvi o problema adicionando o seguinte ao meu arquivo build.gradle, conforme recomendado no segundo link.

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

No entanto, isso só funciona se você estiver usando o gradle 1.3.0-beta2 ou superior, portanto, será necessário adicioná-lo às dependências do buildscript se você estiver em uma versão inferior:

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

Espero que isto ajude.

Milos Savanovic
fonte
Para mim, falhou com: Erro: Falha na execução da tarefa ': xenoAmp: mergeDebugJavaResources'. > Não é possível determinar a pasta de expansão para L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediates \ packagedJarsJavaResources \ debug \ httpclient-android-4.3.5.1.jar1037172435 \ META-INF \ LICENSE com pastas L: \ Projekty \ xenoampgit \ xenoAmp \ build \ intermediários \ sourceFolderJavaResources \ debug, L: \ projekty \ xenoampgit \ xenoAmp \ build \ intermediários \ packagedJarsJavaResources \ debug
ssuukk
@ssuukk Oi, você encontrou uma solução para este erro?
CeccoCQ
2
Infelizmente, a solução foi alterar o destino para a API mais alta atual, e isso quebrou MUITAS coisas! Então eu tive que adicionar "useLibrary", "classpath" PLUS, referência de legado apache lib, conforme descrito em outra parte desta pergunta. E depois que ele foi compilado novamente, apenas decidi abandonar o código Apache e substituí-lo por URLConnection, o que foi mais fácil do que eu pensava.
ssuukk
Concordo com ssuukk. Nenhuma dessas respostas funcionou para mim, então acabei me livrando das bibliotecas Apache também. Eu sou bastante novo no desenvolvimento do Android, mas foi direto.
John81
Eu tive o mesmo problema e corrigi com useLibrary 'org.apache.http.legacy' como Milos disse ... no entanto, para @ssuukk com seu problema, você pode tentar adicionar sempre isso: android {packagingOptions {exclui 'META-INF / LICENSE 'exclude' META-INF / DEPENDENCIES 'exclude' META-INF / NOTICE 'exclua' META-INF / NOTICE.txt 'exclua' META-INF / MANIFEST '}}
Alexiscanny
53

Adicione esta biblioteca ao build.gradle

 android {
      useLibrary 'org.apache.http.legacy'
 }
Darshan Dhoriya
fonte
alguém pode explicar isso? Por que isso faz funcionar? Por que precisamos adicionar essa linha, além de adicionar as dependências?
Dan
2
@ Dan é porque a biblioteca org.apache.http foi removido da versão 23.
eltiare
Para esclarecer, isso não vai para a raiz build.gradle, mas sim dentro do módulo pasta você está construindo (ou seja, "app")
hamx0r
37

cópia org.apache.http.legacy.jarque está na Android/Sdk/platforms/android-23/optionalpasta paraapp/libs

e também adicionou esta linha ao arquivo app.gradle

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

Mas se você estiver usando mais bibliotecas jar, poderá usar desta maneira

compile fileTree(dir: 'libs', include: ['*.jar'])
do01
fonte
2
Em outro dos meus projetos, essa provou ser a única resposta que funcionou com +1 e obrigado.
Apqu 18/11/2015
por que não é essa a resposta?
dibble
1
O mesmo para mim. Alguém deve aceitar esta resposta em vez da resposta aceita agora.
Ivan Fazaniuk 11/01
Esse é o menor caminho de resistência, não tenho certeza se quero diminuir o grau. Compila bem para mim.
Ed Manners
Obrigado! Isso funciona com o plugin gradle-experimental 0.6.0-alpha5. "useLibrary" parece não existir no plugin experimental.
monkey0506
14

Basicamente, tudo o que você precisa fazer é adicionar:

useLibrary  'org.apache.http.legacy'

Para o seu build.gradlearquivo.

ATechPerson
fonte
9

Eu tive o mesmo problema. A resposta de Daniel Nugent ajudou um pouco (depois de seguir seu conselho HttpResponse- mas HttpClientainda faltava).

Então, aqui está o que foi corrigido para mim:

  1. (se ainda não estiver pronto, recomende as instruções de importação anteriores)
  2. visite http://hc.apache.org/downloads.cgi
  3. obtenha o 4.5.1.zipda seção binária
  4. descompacte-o e cole httpcore-4.4.3& httpclient-4.5.1.jarna project/libspasta
  5. clique com o botão direito do mouse no jar e escolha Adicionar como biblioteca .

Espero que ajude.

Martin Pfeffer
fonte
9

Encontrei problemas semelhantes; talvez você consiga fazê-lo funcionar usando um método semelhante.

Primeiro, tente isso com sua configuração atual, exclua httpclientde 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'
} 

No meu caso, eu o corrigi usando os seguintes frascos:

Em seguida, no build.gradle, excluindo httpclientde 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
fonte
Obrigado pela sua resposta, estou com medo que nem funcionou para mim :(
Apqu 15/07/2015
@ isso é estranho, a segunda opção funcionou para mim. Verifique se seus arquivos jar antigos foram excluídos para a segunda opção.
Daniel Nugent
Para que serve libs/core.jar?
IgorGanapolsky
7

Resposta perfeita de Jinu e Daniel

Adicionando a isso, resolvi o problema usando This, se o compileSdkVersion for 19 (IN MY CASE)

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'

caso contrário, se sua compileSdkVersion for 23, use

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'
    }
}
Sofia
fonte
5

Foi isso que fiz e funciona para mim.

etapa 1: adicione isso no build.grade (módulo: app)

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

Etapa 2: sincronizar o projeto e pronto.

NOT_A_PROGRAMMER
fonte
Algum motivo para votar?
NOT_A_PROGRAMMER
falhou ao resolver com o erro "Falha ao resolver: org.jbundle.util.osgi.wrapped: org.jbundle.util.osgi.wrapped.org.apache.http.cli‌ ‌ ent: 4.1.2". Estou usando o gradle experimental 0.6.0-beta. você pode descobrir isso?
Roff
1

A versão do cliente HTTP Apache fornecida no estoque Android era muito, muito antiga .

O Google Android 1.0 foi lançado com um instantâneo pré-BETA do Apache HttpClient. Para coincidir com o primeiro lançamento do Android, as APIs do Apache HttpClient 4.0 tiveram que ser congeladas prematuramente, enquanto muitas das interfaces e estruturas internas ainda não estavam totalmente definidas. Como o Apache HttpClient 4.0 estava amadurecendo, o projeto esperava que o Google incorporasse as melhorias de código mais recentes em sua árvore de códigos. Infelizmente isso não aconteceu.

Embora você possa continuar usando a biblioteca obsoleta antiga por meio da useLibrary 'org.apache.http.legacy'solução alternativa (sugerida por @Jinu e outros), você realmente precisa morder o marcador e atualizar para outra coisa, por exemplo, o Android nativo HttpUrlConnectionou se isso não atender às suas necessidades, você pode usar a biblioteca OkHttp , que HttpUrlConnectioné a base interna de qualquer maneira.

O OkHttp, na verdade, possui uma camada de compatibilidade que usa a mesma API do cliente Apache, embora eles não implementem todos os mesmos recursos, portanto sua milhagem pode variar.

Embora seja possível importar uma versão mais recente do cliente Apache (como sugerido por @MartinPfeffer), é provável que a maioria das classes e métodos que você estava usando antes tenha sido descontinuada, e há um grande risco de que a atualização introduza bugs no seu código (por exemplo, encontrei algumas conexões que funcionavam anteriormente por trás de um proxy não funcionavam mais), portanto, essa não é uma ótima solução.

Tim Rae
fonte
1

Depois de passar dias no assunto, finalmente consegui resolver. Infelizmente, precisamos disso se quisermos usar arquivos de expansão. A solução foi fornecida por algumas pessoas aqui, mas para mim as respostas estavam faltando alguns pequenos detalhes que poderiam economizar muito tempo para mim. Aqui está a sequência de eventos para iniciantes como eu, para economizar seu precioso tempo.

Primeiro importei a pasta "library" de D: \ Users \ Imre \ AppData \ Local \ Android \ sdk1 \ extras \ google \ play_licensing para o projeto, acessando File, New, Import Module e navegando até a pasta "library". Se você abrir o SDK Manager e clicar em "Launch Standalone SDK Manager" na parte inferior da tela pop-up, poderá passar o ponteiro do mouse sobre a pasta "Extras", na parte inferior, e as pequenas informações amarelas informarão onde você encontrará o pacote que você precisa importar.

Feito isso, vá até a seção "biblioteca" no painel esquerdo com "Projeto" e, dentro dela, a guia "Android" aberta. Abra a seção java da biblioteca e abra a classe APKExpansionPolicy. Se você tiver erros e os org.apache.http.NameValuePair de importação e org.apache.http.client.utils.URLEncodedUtils de importação estiverem cinza claro, abra o build.gradle (Projeto: qualquer que seja) e verifique em "buildscript" em "dependências", você inclui o "caminho da classe 'com.android.tools.build:gradle:1.5.0". O 1.5.0 pode ser diferente no seu caso. Eu acho que depende da sua versão do Studio. O meu é 1.5.1. Se o seu for mais recente, você será lembrado para atualizar os números.

Depois disso, vá para "build.gradle (Módulo: biblioteca) e inclua o" useLibrary 'org.apache.http.legacy' na seção "android". Sincronizar agora (canto superior R / H) deve ser oferecido. Faça.

Se você receber mais mensagens de erro (eu não saberia porque fiz o contrário), os arquivos Apache podem estar ausentes no seu projeto, pois o apache não é mais suportado. Encontre-os em C / D: Usuários / Seu nome / AppData / Local / Android / Sdk / plataformas / android-23 / opcional e copie / cole-os na pasta yourproject / app / libs. Você deve ter um arquivo opcional.json e org.apache.http.legacy.jar lá. É melhor ir ao site do apache e baixar a versão mais recente: http://hc.apache.org/downloads.cgi Descompacte-o em qualquer lugar que desejar, abra-o, vá para "lib", copie o httpclient-4.5.1 .jar e substitua o arquivo org.apache.http.legacy.jar por ele.

Sincronize e reconstrua / limpe seu projeto, e isso deve ser bom.

Por precaução, abra o seu terminal (parte inferior esquerda do Android Studio) e digite "gradlew clean". Ele instalará algumas coisas. Uma vez feito, digite "gradlew assemble". Demorará alguns minutos para terminar, mas os erros serão exibidos se você tiver algum, é claro. Se você não conseguir digitar nada no Terminal, inicie o prompt de comando (botão Windows + R), digite cmd, pressione OK, clique com o botão direito do mouse no título da pequena tela pop-up preta (C: \ WINDOWS \ system32 \ cmd.exe) , Propriedades, Opções, na parte inferior da janela, verifique se "Usar console herdado" está espessa. Reinicie o A.Studio.

Boa sorte!

Immy
fonte
1

Eu tive que postar, pois nenhuma das respostas acima funcionou completamente para mim.

Estou usando o Android Studio

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

compileSdkVersion 23
buildToolsVersion "23.0.3"

Etapa 1: Faça o download do último arquivo jar ( http://www-eu.apache.org/dist//httpcomponents/httpclient/binary/httpcomponents-client-4.5.2-bin.zip )

Etapa 2: Copie e cole o arquivo .jar na pasta libs (crie se já não existir) no seu módulo (pode ser aplicativo ou biblioteca)

Etapa 3: Clique com o botão direito do mouse no jar e em "Adicionar como biblioteca". Ele adicionará automaticamente o arquivo jar como uma dependência no arquivo gradle do seu módulo

Etapa 4: agora, automaticamente, seu problema será resolvido, mas, se você estiver usando o programa em seu aplicativo, ele avisará sobre arquivos de classe duplicados e não permitirá a criação. É um bug conhecido e você precisa adicionar o seguinte às regras do seu proguard

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

Boa sorte!

Debasish Mitra
fonte
0

No meu caso, atualizei uma das minhas bibliotecas no meu projeto android.

Estou usando o Reservoir como minha solução de armazenamento em cache: https://github.com/anupcowkur/Reservoir

Eu fui de:

compile 'com.anupcowkur:reservoir:2.1'

Para:

compile 'com.anupcowkur:reservoir:3.1.0'

O autor da biblioteca deve ter removido a biblioteca commons-io do repositório para que meu aplicativo não funcione mais.

Eu tive que incluir manualmente o commons-io adicionando isso ao gradle:

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

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

Simon
fonte