Загрузите изображение через ошибку броска залпа. Наличие массива изображения и массива текста [дубликат]

На этот вопрос уже есть ответ здесь:

Получение NoSuchFieldError INSTANCE org / apache / http / message / BasicHeaderValueParser 4 ответаРешение дано ниже

Я использую библиотеку залпа, чтобы загрузить изображение. Условие, которое я должен отправить

key1 = строковое значениеkey2 = строковое значениеkey3 {= file} = значение изображения, т.е. jpeg, jpg

Это код, который я использую (закомментированную часть я уже пробовал) -

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.HttpHeaderParser;
import <APP_CLASS IGNORE THIS>.Config

import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.util.CharsetUtils;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Created by Jimit Patel on 26/09/15.
 */
public class MyClass extends Request<String> {

    private static final String TAG = MyClass.class.getSimpleName();
    private static final boolean IS_DEBUG = true;
    private static final String FILE_PART_NAME = "file";

    private MultipartEntityBuilder multipartEntityBuilder;
    private Response.Listener<String> mListener;
    private Map<String, String> mRequestParams;
    private File file;
    private String tokenId;

    public AddWardrobeRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener,
                              File file, Map<String, String> requestParams, String tokenId) {
        super(method, url, errorListener);

        mListener = listener;
        this.file = file;
        this.tokenId = tokenId;
        mRequestParams = requestParams;

        buildMultipartEntity();
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        return Response.success("Result", getCacheEntry());
    }

    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        Map<String, String> headers = super.getHeaders();

        if (headers == null
                || headers.equals(Collections.emptyMap())) {
            headers = new HashMap<>();
        }
        headers.put(Config.HEADER_AUTHORIZATION, "Bearer " + tokenId);
//        headers.put("Accept", "application/json");
//        headers.put("Content-Type", "multipart/form-data");

        return headers;
    }

    @Override
    public String getBodyContentType() {
        String contentTypeHeader = multipartEntityBuilder.build().getContentType().getValue();
        return contentTypeHeader;
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            multipartEntityBuilder.build().writeTo(bos);
        } catch (IOException e) {
            VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
        }

        return bos.toByteArray();
    }

    private void buildMultipartEntity() {
        multipartEntityBuilder = MultipartEntityBuilder.create();
        multipartEntityBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
//        multipartEntityBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
//        try {
//            multipartEntityBuilder.setCharset(CharsetUtils.get("UTF-8"));
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
        multipartEntityBuilder.addPart(FILE_PART_NAME, new FileBody(file) );
        Set<String> keys = mRequestParams.keySet();
        for (String key : keys)
            multipartEntityBuilder.addTextBody(key, mRequestParams.get(key));
    }
}

Ниже приведена ошибка, с которой я сталкиваюсь.

Process: com.stylabs.APP.app, PID: 12804
java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicHeaderValueFormatter; in class Lorg/apache/http/message/BasicHeaderValueFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicHeaderValueFormatter' appears in /system/framework/ext.jar)
        at org.apache.http.entity.ContentType.toString(ContentType.java:153)
        at org.apache.http.entity.mime.MultipartFormEntity.<init>(MultipartFormEntity.java:53)
        at org.apache.http.entity.mime.MultipartEntityBuilder.buildEntity(MultipartEntityBuilder.java:236)
        at org.apache.http.entity.mime.MultipartEntityBuilder.build(MultipartEntityBuilder.java:240)
        at MyClass.getBody(MyClass.java:90)
        at com.android.volley.toolbox.HurlStack.addBodyIfExists(HurlStack.java:253)
        at com.android.volley.toolbox.HurlStack.setConnectionParametersForRequest(HurlStack.java:227)
        at com.android.volley.toolbox.HurlStack.performRequest(HurlStack.java:107)
        at com.android.volley.toolbox.BasicNetwork.performRequest(BasicNetwork.java:96)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:112)

Пожалуйста, помогите мне. Заранее спасибо!!

РЕШЕНИЕ

Хотя, помеченный как дубликат, я не нашел там никакого решения. Я наконец вычеркнул то, что мне не хватало. Я перечитал документ на Android, который я могу найти здесь -http://developer.android.com/preview/behavior-changes.html#behavior-apache-http-client

Итак, я удалил все этиhttpcomponents which includes httpcore, httpmime, httpclient, etc. Не знаю сейчас, какие дерьмовые предложения были предложены при переполнении стека, все было возможно до вчерашнего дня, но не с M preview +. Вместо этого добавить

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

И класс запроса, который использовался ранее, изменяется, как указано ниже -

import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;

    import com.android.volley.AuthFailureError;
    import com.android.volley.NetworkResponse;
    import com.android.volley.Request;
    import com.android.volley.Response;
    import com.android.volley.VolleyError;
    import <APP_CLASS IGNORE THIS>.Config

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.DataOutputStream;
    import java.io.File;
    import java.io.IOException;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Set;

    /**
     * Created by Jimit Patel on 26/09/15.
     */
    public class MyClass extends Request<String> {

        private static final String TAG = AddWardrobeRequest.class.getSimpleName();
        private static final boolean IS_DEBUG = true;

// This is the key for the file to be sent
        private static final String FILE_PART_NAME = "file";

        private Response.Listener<String> mListener;
        private Response.ErrorListener mErrorListener;
        private Map<String, String> mRequestParams;
        private File file;
        private String tokenId;

        private final String BOUNDARY = "3i2ndDfv2rTHiSisAbouNdArYfORhtTPEefj3q2f";
        private final String CRLF = "\r\n";
        private final int MAX_BUFFER_SIZE = 1024 * 1024;

        public MyClass(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener,
                                  File file, Map<String, String> requestParams, String tokenId) {
            super(method, url, errorListener);

            mListener = listener;
            mErrorListener = errorListener;
            this.file = file;
            this.tokenId = tokenId;
            mRequestParams = requestParams
        }

        @Override
        protected Response<String> parseNetworkResponse(NetworkResponse response) {
            return Response.success(new String(response.data), getCacheEntry());
        }

        @Override
        protected void deliverResponse(String response) {
            mListener.onResponse(response);
        }

        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> headers = super.getHeaders();

            if (headers == null
                    || headers.equals(Collections.emptyMap())) {
                headers = new HashMap<>();
            }
            headers.put(Config.HEADER_AUTHORIZATION, "Bearer " + tokenId);
            headers.put("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

            return headers;
        }

        @Override
        protected VolleyError parseNetworkError(VolleyError volleyError) {
            return super.parseNetworkError(volleyError);
        }

        @Override
        public void deliverError(VolleyError error) {
            mErrorListener.onErrorResponse(error);
        }

        @Override
        public byte[] getBody() throws AuthFailureError {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(bos);
    try {
        PrintWriter pw = new PrintWriter(new OutputStreamWriter(dos, "UTF-8"));

        Set<String> keys = mRequestParams.keySet();


pw.append(CRLF);
        for (String key : keys) {
            pw.append("--" + BOUNDARY + CRLF);
            pw.append("Content-Disposition: form-data; ");
            pw.append("name=\"" + key + "\"" + CRLF + CRLF + mRequestParams.get(key) + CRLF);
        }

        pw.append("--" + BOUNDARY + CRLF);
        pw.append("Content-Disposition: form-data; ");
        pw.append("name=\"" + FILE_PART_NAME + "\"; filename=\"" + file.getName() + "\"" + CRLF + CRLF);

        dos.writeBytes(pw.toString());
        pw.flush();
        FileInputStream inputStream = new FileInputStream(file);
        int bytesAvailable = inputStream.available();
        int bufferSize = Math.min(bytesAvailable, MAX_BUFFER_SIZE);
        byte[] buffer = new byte[bufferSize];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1)
            dos.write(buffer, 0, bytesRead);

        dos.writeBytes(CRLF + "--" + BOUNDARY + "--" + CRLF);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bos.toByteArray();
        }
    }

И, наконец, получил правильный ответ по желанию. Я надеюсь, что это поможет другим, у которых все такие же проблемы, как и у меня. :)

Ответы на вопрос(1)

Ваш ответ на вопрос