2015-11-11 2 views
0

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

ответ

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

Посмотрите this - пример без использования HttpEntity.

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

+0

Спасибо, что ответили на мой вопрос. Я попробую прямо сейчас и приму это после проверки. – mok

+0

Ваше решение использует 'HttpEntity' и, похоже, не работает с последними API-интерфейсами. – mok

+1

Yaa..your right, но не знает об изменениях поведения API, но имеет значение android marshmallow.see my edit –

Смежные вопросы