Использование залпа для загрузки видео

В моем приложении пользователи должны иметь возможность загружать свои видео со своего телефона на удаленный сервер. Я не хочу использовать такие подходы, как здесь, где я должен позаботиться всего вместе со многими другими недостатками. Можно ли для этой цели использовать залп? Если да, объясните, как это сделать, или упомяните учебник.


person mok    schedule 11.11.2015    source источник


Ответы (1)


Вы можете использовать следующий фрагмент для любого составного запроса, использующего залп.

import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
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 org.apache.http.HttpEntity;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.entity.mime.content.FileBody;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

public class TestMultiPartRequestextends Request<JSONObject> {

// private MultipartEntity entity = new MultipartEntity();

    MultipartEntityBuilder entity = MultipartEntityBuilder.create();
    HttpEntity httpentity;
    private static final String FILE_PART_NAME = "import_file";

    private final Response.Listener<JSONObject> mListener;
    private final Response.ErrorListener mErrorListener;
    private final File mFilePart;
    private final Map<String, String> mStringPart;

    public TestMultiPartRequest(String url, Response.ErrorListener errorListener,
                                 Response.Listener<JSONObject> listener, File file,
                                 Map<String, String> mStringPart) {
        super(Method.POST, url, errorListener);
        this.mErrorListener = errorListener;
        mListener = listener;
        mFilePart = file;
        this.mStringPart = mStringPart;
        entity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
        buildMultipartEntity();
    }

    public void addStringBody(String param, String value) {
        mStringPart.put(param, value);
    }

    private void buildMultipartEntity() {
        entity.addPart(FILE_PART_NAME, new FileBody(mFilePart));
        for (Map.Entry<String, String> entry : mStringPart.entrySet()) {
            entity.addTextBody(entry.getKey(), entry.getValue());
        }
    }

    @Override
    public String getBodyContentType() {
        return httpentity.getContentType().getValue();
    }

    @Override
    public byte[] getBody() throws AuthFailureError {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try {
            httpentity = entity.build();
            httpentity.writeTo(bos);
        } catch (IOException e) {
            VolleyLog.e("IOException writing to ByteArrayOutputStream");
        }
        return bos.toByteArray();
    }

    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
            String jsonString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

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

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

использование

TestMultiPartRequest multiPartRequest = new TestMultiPartRequest (URL, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
               //Error response
            }
        }, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
               //Response
            }
        }, new File(fPath), params);

        multiPartRequest.setRetryPolicy(new DefaultRetryPolicy(5 * 1000, 0,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        TestVolleyHelper.getInstance(getApplicationContext()).addToRequestQueue(multiPartRequest);

TestVolleyHelper

import android.content.Context;
import android.text.TextUtils;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.Volley;


public class TestVolleyHelper {

    private static final String TAG = TestVolleyHelper.class
            .getSimpleName();

    private RequestQueue mRequestQueue;
    private static TestVolleyHelper mInstance;

    public TestVolleyHelper(Context context) {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(context);
        }
    }

    public static synchronized TestVolleyHelper getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new TestVolleyHelper(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req, String tag) {
        // set the default tag if tag is empty
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }

    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }

    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

Взгляните на это пример без использования HttpEntity.

И не используйте HttpEntity. Он был полностью удален в Android-M, так как недавно устарел.

person Anoop M Maddasseri    schedule 11.11.2015
comment
Спасибо, что ответили на мой вопрос. Попробую прямо сейчас и приму после проверки. - person mok; 11.11.2015
comment
Ваше решение использует HttpEntity и, похоже, не работает с самыми последними API. - person mok; 11.11.2015
comment
Яа ... вы правы, но не знаете об API, но поведение зефира Android меняется. См. Мое редактирование - person Anoop M Maddasseri; 11.11.2015