2016-08-20 68 views

回答

-4

排除库已弃用,因此请勿使用排空库。

Volley的最佳选择是RetroFit库。

您可以使用异步任务下载视频文件。

+0

排球不被剥夺。 Volley使用的Apache HTTP客户端被depricated。我不知道这会让Volley被摧毁。我的谷歌搜索没有证实。 AsyncTask对于网络来说是一个糟糕的主意,特别是对于像视频下载这样的繁重工作。 – Sermilion

0

首先,你必须创建自己的自定义请求类一样,

class InputStreamVolleyRequest extends Request<byte[]> { 
    private final Response.Listener<byte[]> mListener; 
    private Map<String, String> mParams; 

    //create a static map for directly accessing headers 
    public Map<String, String> responseHeaders ; 

    public InputStreamVolleyRequest(int method, String mUrl ,Response.Listener<byte[]> listener, 
            Response.ErrorListener errorListener, HashMap<String, String> params) { 
     // TODO Auto-generated constructor stub 

     super(post, mUrl, errorListener); 
     // this request would never use cache. 
     setShouldCache(false); 
     mListener = listener; 
     mParams=params; 
    } 

    @Override 
    protected Map<String, String> getParams() 
     throws com.android.volley.AuthFailureError { 
     return mParams; 
    }; 


    @Override 
    protected void deliverResponse(byte[] response) { 
     mListener.onResponse(response); 
    } 

    @Override 
    protected Response<byte[]> parseNetworkResponse(NetworkResponse response) { 

     //Initialise local responseHeaders map with response headers received 
     responseHeaders = response.headers; 

     //Pass the response data here 
     return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response)); 
    } 
} 

现在只要发送请求,虽然我们与Request.Method.GET自定义类,并从那里你要下载文件的URL。

String mUrl= <YOUR_URL>; 
InputStreamVolleyRequest request = new InputStreamVolleyRequest(Request.Method.GET, mUrl, 
     new Response.Listener<byte[]>() { 
      @Override 
      public void onResponse(byte[] response) { 
      // TODO handle the response 
      try { 
      if (response!=null) { 

       FileOutputStream outputStream; 
       String name=<FILE_NAME_WITH_EXTENSION e.g reference.txt>; 
       outputStream = openFileOutput(name, Context.MODE_PRIVATE); 
       outputStream.write(response); 
       outputStream.close(); 
       Toast.makeText(this, "Download complete.", Toast.LENGTH_LONG).show(); 
      } 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE"); 
      e.printStackTrace(); 
     } 
    } 
} ,new Response.ErrorListener() { 

    @Override 
    public void onErrorResponse(VolleyError error) { 
    // TODO handle the error 
    error.printStackTrace(); 
    } 
}, null); 
      RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new HurlStack()); 
      mRequestQueue.add(request); 

现在转到您的应用程序文件夹的数据/数据//并有你的文件,你也可以将文件下载到外部stoage。

可以使用

Context.getFilesDir().<file_name> 

它返回从应用程序的内部目录名称的文件和空,如果有这样的名称的文件访问内部存储的文件。不要忘记添加名称的文件扩展名。

+1

什么是openFileOutput(name,Context.MODE_PRIVATE); 和这个方法在哪里? –

+0

从[Context class](https://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String,%20int)) – Yehonatan

2

首先,我们需要创建一个扩展Volley请求类的自定义类。要下载文件数据,我们可以创建一个自定义字节数组请求。这个字节数组可以转换成将数据写入SDCard的输入流。以下InputStreamVolleyRequest.java文件显示了如何创建一个自定义字节数组请求和访问响应标头,稍后将用它来创建文件名。

InputStreamVolleyRequest.java

import com.android.volley.AuthFailureError; 
import com.android.volley.NetworkResponse; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.toolbox.HttpHeaderParser; 
import java.util.HashMap; 
import java.util.Map; 

public class InputStreamVolleyRequest extends Request<byte[]> { 
private final Response.Listener<byte[]> mListener; 
private Map<String, String> mParams; 
//create a static map for directly accessing headers 
public Map<String, String> responseHeaders ; 

public InputStreamVolleyRequest(int post, String mUrl,Response.Listener<byte[]> listener, 
           Response.ErrorListener errorListener, HashMap<String, String> params) { 
    // TODO Auto-generated constructor stub 

    super(post, mUrl, errorListener); 
    // this request would never use cache. 
    setShouldCache(false); 
    mListener = listener; 
    mParams=params; 
} 

@Override 
protected Map<String, String> getParams() 
     throws com.android.volley.AuthFailureError { 
    return mParams; 
}; 


@Override 
protected void deliverResponse(byte[] response) { 
    mListener.onResponse(response); 
} 

@Override 
protected Response<byte[]> parseNetworkResponse(NetworkResponse response) { 

    //Initialise local responseHeaders map with response headers received 
    responseHeaders = response.headers; 

    //Pass the response data here 
    return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response)); 
} 

}

你的Activity类.....

import android.os.Environment; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import com.android.volley.Request; 
import com.android.volley.RequestQueue; 
import com.android.volley.Response; 
import com.android.volley.Response.ErrorListener; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.HurlStack; 
import com.android.volley.toolbox.Volley; 
import java.io.BufferedOutputStream; 
import java.io.ByteArrayInputStream; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.HashMap; 


public class FileDownloadActivity extends ActionBarActivity implements Response.Listener<byte[]>, ErrorListener{ 
Button btn_download; 
InputStreamVolleyRequest request; 
int count; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_file_download); 
    btn_download =(Button)findViewById(R.id.button); 
    btn_download.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      //Change your url below 
      String mUrl="http://yoururl.com"; 
      request = new InputStreamVolleyRequest(Request.Method.GET, mUrl, FileDownloadActivity.this, FileDownloadActivity.this, null); 
      RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), 
        new HurlStack()); 
      mRequestQueue.add(request); 
     } 
    }); 
} 

@Override 
public void onResponse(byte[] response) { 
    HashMap<String, Object> map = new HashMap<String, Object>(); 
    try { 
     if (response!=null) { 

      //Read file name from headers 
      String content =request.responseHeaders.get("Content-Disposition") 
        .toString(); 
      StringTokenizer st = new StringTokenizer(content, "="); 
      String[] arrTag = st.toArray(); 

      String filename = arrTag[1]; 
      filename = filename.replace(":", "."); 
      Log.d("DEBUG::RESUME FILE NAME", filename); 

      try{ 
       long lenghtOfFile = response.length; 

       //covert reponse to input stream 
       InputStream input = new ByteArrayInputStream(response); 
       File path = Environment.getExternalStorageDirectory(); 
       File file = new File(path, filename); 
       map.put("resume_path", file.toString()); 
       BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream(file)); 
       byte data[] = new byte[1024]; 

       long total = 0; 

       while ((count = input.read(data)) != -1) { 
        total += count; 
        output.write(data, 0, count); 
       } 

       output.flush(); 

       output.close(); 
       input.close(); 
      }catch(IOException e){ 
       e.printStackTrace(); 

      } 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE"); 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onErrorResponse(VolleyError error) { 
    Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE. ERROR:: "+error.getMessage()); 
} 
} 

这StringTokenizer类..... StringTokenizer.java