I'm working on an android app that needs to save a pdf file from an api. So I had to extend Request volley class to a ByteArray class:
package br.com.tarcisojunior.myapp;
import android.support.annotation.NonNull;
import com.android.volley.NetworkResponse;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.toolbox.HttpHeaderParser;
/**
 * Created by tarcisojunior on 18/04/18.
 */
public class ByteArrayRequest extends Request<byte[]> {
    private final Response.Listener<byte[]> mListener;
    public ByteArrayRequest(String url, Response.Listener<byte[]> listener,
                       Response.ErrorListener errorListener) {
        this(Method.GET, url, listener, errorListener);
    }
    public ByteArrayRequest(int method, String url, Response.Listener<byte[]> listener, Response.ErrorListener errorListener) {
        super(method, url, errorListener);
        mListener = listener;
    }
    @Override
    protected Response parseNetworkResponse(NetworkResponse response) {
        return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response));
    }
    @Override
    protected void deliverResponse(byte[] response) {
        if(null != mListener){
            mListener.onResponse(response);
        }
    }
    @Override
    public String getBodyContentType() {
        return "application/octet-stream";
    }
}
I my Activity i'm calling ByteArrayRequest to perform an api request:
private void getCarnePDF(final int empreendimento,final int coligada,final String quadra,final String lote){ RequestQueue requestQueue; ByteArrayRequest request;
requestQueue = Volley.newRequestQueue(this);
request = new ByteArrayRequest(Request.Method.GET, getString(R.string.baseUrl) + getString(R.string.carnePdfUrl),
        new Response.Listener<byte[]>() {
            @Override
            public void onResponse(byte[] response) {
                Log.i("getBilletCard", response.toString());
                try {
                    byte[] bytes = response;
                    saveToFile(bytes, "card.pdf");
                }catch (Exception e){
                    Toast.makeText(BilletCardActivity.this, "Erro ao converter resposta", Toast.LENGTH_LONG).show();
                }
            }
        },
        new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                error.printStackTrace();
            }
        }){
    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        HashMap<String, String> headers = new HashMap<String, String>();
        //headers.put("Content-Type", "application/json");
        headers.put("token", token);
        headers.put("empreendimento", String.valueOf(empreendimento));
        headers.put("coligada", String.valueOf(coligada));
        headers.put("quadra", quadra);
        headers.put("lote",lote);
        return headers;
    }
};
requestQueue.add(request);
}
and in listener the saveToFile function should create the pdf file. The pdf file is created but raises an error "Can't open file". Here's my saveToFile function:
public void saveToFile(byte[] byteArray, String pFileName){
        File f = new File(Environment.getExternalStorageDirectory() + "/myappname");
        if (!f.isDirectory()) {
            f.mkdir();
        }
        String fileName = Environment.getExternalStorageDirectory() + "/myappname/" + pFileName;
        try {
            FileOutputStream fPdf = new FileOutputStream(fileName);
            fPdf.write(byteArray);
            fPdf.flush();
            fPdf.close();
            Toast.makeText(this, "File successfully saved", Toast.LENGTH_LONG).show();
        } catch (FileNotFoundException e) {
            Toast.makeText(this, "File create error", Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(this, "File write error", Toast.LENGTH_LONG).show();
        }
}
The file is successfully create, but it doesn't open

When I tried same endpoint from Postman, everything works fine and file is successful saved and opened
