8

Cerco di includere httpmime nella mia applicazione usando il file build.gradle, e tutto si compila bene. Invece, quando l'applicazione tenta di utilizzare effettivamente la classe MultipartEntityBuilder, ci sono un sacco di messaggi di livello WARN sul registro che dicono che ci sono problemi.Problemi inclusi Apache HttpComponents nel progetto Android Gradle

Ecco l'estratto dal mio build.gradle per la dipendenza:

 
    compile('org.apache.httpcomponents:httpmime:4.+') { 
     exclude module: "httpclient" 
    } 

Qui sono gli errori:

 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 6967 (DEFAULT_BINARY) in Lorg/apache/http/entity/ContentType; 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 6967 (DEFAULT_BINARY) in Lorg/apache/http/entity/ContentType; 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 6967 (DEFAULT_BINARY) in Lorg/apache/http/entity/ContentType; 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.367 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to resolve static method 19478: Lorg/apache/http/util/Args;.notNull (Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object; 
10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 6968 (DEFAULT_TEXT) in Lorg/apache/http/entity/ContentType; 
10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 
10-09 13:39:37.377 2409-2426/com.company.app W/dalvikvm﹕ VFY: unable to find class referenced in signature (Lorg/apache/http/entity/ContentType;) 

la classe Java:

 
import android.util.Log; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 

import org.apache.http.HttpEntity; 
import org.apache.http.entity.mime.MultipartEntityBuilder; 

public class FileUploader { 
    private final static String BOUNDARY = "__--__--__SERVETHEOVERMIND-__-_"; 

    public void uploadFile(String targetUrl, MultipartEntityBuilder upload, UploadHandler after) { 
     Log.v("FileUploader", "Uploading to " + targetUrl); 

     HttpURLConnection con = null; 
     OutputStream os = null; 
     InputStream is = null; 

     try { 
      HttpEntity uploadEntity = upload.build(); 
      URL postTo = new URL(targetUrl); 
      con = (HttpURLConnection) postTo.openConnection(); 

      con.setRequestMethod("POST"); 
      con.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + BOUNDARY); 
      con.setDoOutput(true); 
      con.setDoInput(true); 
      con.setUseCaches(false); 

      con.addRequestProperty("Connection", "Keep-Alive"); 
      con.setRequestProperty("Content-length", String.valueOf(uploadEntity.getContentLength())); 

      os = con.getOutputStream(); 
      uploadEntity.writeTo(os); 
      os.close(); 

      con.connect(); 
      is = con.getInputStream(); 

      after.consumeUploadResponse(is); 
      con.disconnect(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     if(con != null) { 
      con.disconnect(); 
     } 

     if(os != null) { 
      try { 
       os.close(); 
      } catch (IOException e) { 
       Log.v("Uploader", "Closed output stream"); 
      } 
     } 

     if(is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.v("Uploader", "Closed input stream"); 
      } 
     } 
    } 

    public interface UploadHandler { 
     public void consumeUploadResponse(InputStream stream); 
    } 
} 

[EDIT] Dipendenze corrette, come da risposta

 
compile('org.apache.httpcomponents:httpmime:4.+') { 
    exclude module: "httpclient" 
} 
compile('org.apache.httpcomponents:httpcore:4.+') { 
    exclude module: "httpclient" 
} 

[SECONDO EDIT] ancora problemi - ora è questi altri pezzi mancanti, ma potrebbe essere problemi sul back-end:

 
10-10 11:51:54.998 29597-29638/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 7465 (INSTANCE) in Lorg/apache/http/message/BasicHeaderValueParser; 
10-10 11:51:54.998 29597-29638/com.company.app W/dalvikvm﹕ VFY: unable to resolve static field 7459 (INSTANCE) in Lorg/apache/http/message/BasicHeaderValueFormatter; 

[ANCORA UN ALTRO EDIT]

Sembra che gli ultimi piccoli bit mancanti non abbiano alcun effetto sull'uso corretto di MultipartEntityBuilder in questo caso.

+0

Sei riuscito a rimuovere gli avvisi di campo statici Lorg/apache/http/message ....? Mi sembra di avere un problema simile ora. –

+0

il tuo primo blocco di codice sopra ha corretto l'avviso che stavo ottenendo su Android Studio. Grazie! – Josh

risposta

8

È necessario aggiungere httpcore-4.3.jar al percorso di generazione java. Ho avuto lo stesso problema ed è andato dopo aver aggiunto questo barattolo.

+0

Ho pensato che fosse, ma sono ancora bloccato su problemi simili –

+0

Sembra che funzioni probabilmente, nonostante gli ultimi messaggi di errore - ora sto esaminando i problemi sul backend delle rotaie –

+0

Se sei nuovo su Android Studio e Ora assicurati come aggiungere il jar al tuo percorso di build, vedi questa risposta a una domanda simile: http://stackoverflow.com/a/28712564 - devi solo cercare da 'httpcore' invece di' httpmime'. –

13

Questo è quanto ho fatto nella mia Gradle ..

dependencies { 
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' 

} 
} 

E dentro Android

android{ 
packagingOptions { 
    exclude 'META-INF/DEPENDENCIES' 
    exclude 'META-INF/NOTICE' 
    exclude 'META-INF/LICENSE' 
} 
} 
0
compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1' compile('org.apache.httpcomponents:httpmime:4.3') { 
    exclude module: "httpclient" } 

È possibile utilizzare questi sopra le dipendenze al build.gradle (Modulo: app) al tuo progetto per le seguenti dichiarazioni IMPORT

import org.apache.http.entity.ContentType; import org.apache.http.entity.mime.MIME;

Problemi correlati