2016-08-20 30 views

答えて

-4

Volleyライブラリは廃止されていますので、Volleyライブラリは使用しないでください。

Volleyの最善の選択肢は、RetroFitライブラリです。

非同期タスクを使用してビデオファイルをダウンロードできます。

+0

バレーは降格されていません。 Apache HTTPクライアントは、Volleyの使用は控えめです。私はそれを知らないので、ボレーは負担になります。私のGoogle検索ではそれが確認されなかった。そして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); 

アプリケーションフォルダdata/data //に移動し、ファイルがあります。外部ファイルにダウンロードすることもできます。

あなたは、このような名前のファイルがない場合には、アプリケーションの内部ディレクトリから、その名前を持つファイルとヌルを返し

Context.getFilesDir().<file_name> 

使用して、内部ストレージ内のファイルにアクセスすることができます。名前でファイルの拡張子を追加するのを忘れないでください。

+1

openFileOutput(name、Context.MODE_PRIVATE)とは何ですか? この方法はどこですか? –

+0

[Contextクラス](https://developer.android.com/reference/android/content/Context.html#openFileOutput(java.lang.String、%20int))から – Yehonatan

2

まず、Volley Requestクラスを拡張するカスタムクラスを作成する必要があります。ファイルデータをダウンロードするには、カスタムバイト配列リクエストを作成することができます。このバイト配列は、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

関連する問題