Проблемы с включением Apache HttpComponents в проект Android Gradle

Я пытаюсь включить httpmime в свое приложение с помощью файла build.gradle, и все компилируется нормально. Вместо этого, когда приложение пытается фактически использовать класс MultipartEntityBuilder, в журнале появляется множество сообщений уровня WARN, говорящих о наличии проблем.

Вот отрывок из моего build.gradle для зависимости:

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

Вот ошибки:

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;)

Класс 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] Правильные зависимости, согласно ответу

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

[ВТОРОЕ РЕДАКТИРОВАНИЕ] По-прежнему возникают проблемы - теперь это другие недостающие биты, но это могут быть проблемы на бэкэнде:

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;

[ЕЩЕ ЕЩЕ ОДИН ИЗМЕНЕНИЕ]

Кажется, что последние маленькие недостающие биты никак не влияют на успешное использование MultipartEntityBuilder в этом случае.


person A. Rager    schedule 09.10.2013    source источник
comment
Удалось ли вам удалить предупреждения статического поля Lorg / apache / http / message ....? Кажется, у меня сейчас аналогичная проблема.   -  person Simon Langhoff    schedule 30.10.2014
comment
ваш первый блок кода выше исправил предупреждение, которое я получал в студии Android. Спасибо!   -  person joshkendrick    schedule 02.12.2014


Ответы (3)


Вам нужно добавить httpcore-4.3.jar в путь сборки java. У меня была такая же проблема, и она исчезла после добавления этой банки.

person Gary Kipnis    schedule 10.10.2013
comment
Я думал, что это все, но я все еще застрял на подобных проблемах - person A. Rager; 10.10.2013
comment
Похоже, это, вероятно, работает, несмотря на последние сообщения об ошибках - теперь я ищу проблемы на бэкэнде rails - person A. Rager; 10.10.2013
comment
Если вы новичок в Android Studio и теперь знаете, как добавить банку в путь сборки, см. Этот ответ на аналогичный вопрос: stackoverflow.com/ a / 28712564 - вам просто нужно искать с httpcore вместо httpmime. - person ban-geoengineering; 15.09.2015

Вот как я поступал в учебе ..

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'

}
}

А внутри андроид

android{
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
}
}
person Jonatan    schedule 09.06.2015

 compile group: 'org.apache.httpcomponents' , name: 'httpclient-android' , version: '4.3.5.1'  compile('org.apache.httpcomponents:httpmime:4.3') {
  exclude module: "httpclient"  }

Вы можете использовать эти вышеупомянутые зависимости для build.gradle (Module: app) вашего проекта для следующих операторов IMPORT

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

person Eshan Chattaraj    schedule 15.09.2017