Използване на залпове за качване на видео

В моето приложение потребителите трябва да могат да качват своите видеоклипове от телефона си на отдалечен сървър. Не искам да използвам подходи като този, където трябва да се грижа на всичко заедно с много други недостатъци. Възможно ли е да се използва залп за тази цел? Ако да, моля, обяснете как или споменете урок.


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 marshmallow. Вижте моята редакция - person Anoop M Maddasseri; 11.11.2015