使用Android Volley下载MP3文件

问题描述 投票:0回答:1

我正在运行带有一些MP3文件的Django服务器,并且已对其进行设置,因此我可以发送带有所需文件的“ songId”的JSON请求,并返回指定的MP3。

[当我在Postman上尝试时可以使用,但是我不知道如何在Android上使用Volley来接收它。每当我尝试从JSON更改响应对象时,都会收到错误消息。感谢您的任何帮助,谢谢!

编辑:这是我通常用于获取JSON响应的代码

        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
        try {
            JSONObject jsonObject = new JSONObject().put("songId", "43");

            JsonObjectRequest objectRequest = new JsonObjectRequest(
                    com.android.volley.Request.Method.POST,
                    url,
                    jsonObject,
                    new com.android.volley.Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.e("REST Response", response.toString());
                        }
                    },
                    new com.android.volley.Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("REST Error", error.toString());
                        }
                    })
            {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> headers = new HashMap<>();
                    SharedPreferences sharedPreferences = getSharedPreferences("StoredValues", MODE_PRIVATE);
                    String token = sharedPreferences.getString("token", "null");
                    headers.put("Authorization", "Token " + token);
                    return headers;
                }
            };
            objectRequest.setRetryPolicy(new RetryPolicy() {
                @Override
                public int getCurrentTimeout() {
                    return 10000;
                }

                @Override
                public int getCurrentRetryCount() {
                    return 10000;
                }

                @Override
                public void retry(VolleyError error) throws VolleyError {
                    Log.e("Volley error", error.toString());
                }
            });

            requestQueue.add(objectRequest);

        } catch (JSONException e){
            Log.e("JSON Response", e.toString());
        }
android android-volley mp3
1个回答
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(method, 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 
public Map<String, String> getHeaders() throws AuthFailureError { 
  Map<String, String> params = new HashMap<String, String>();                
  params.put("Content-Type", "application/json");
  return params; 
} 

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

并可以这样发出您的请求

   String mUrl= <YOUR_URL>;
   HashMap<String,String>hasMap = new HashMap<>();
   hashMap.put("songId","1");
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();
  }
}, hashmap);
          RequestQueue mRequestQueue = Volley.newRequestQueue(getApplicationContext(), new HurlStack());
          mRequestQueue.add(request);
© www.soinside.com 2019 - 2024. All rights reserved.