Search code examples
javaandroidandroid-volley

Volley get image from API


I'm having problem fetching image from API. When i watch response in Postman and save it as image - it saves it just fine and it is valid image. But I cant get it to work in java.

Below is my HTTPRequest class

public class HTTPRequest {

    public interface VolleyCallback{
        void onSuccess(String result);
        void onError(String errorMessage);
    }

    public static final int MY_SOCKET_TIMEOUT_MS = 5000;

    public static void call(final Context Context, String URL, Integer Type, final VolleyCallback callback) {

        final RequestQueue requestQueue = Volley.newRequestQueue(Context);
        StringRequest stringRequest = new StringRequest(Type, URL,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        callback.onSuccess(response);
                        requestQueue.stop();
                    }
                },
                new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            error.printStackTrace();
                            requestQueue.stop();
                            `enter code here`callback.onError(error.getMessage());
                        }
                }) {
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                String credentials = "notvisibletoyou:)";
                String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                //headers.put("Content-Type", "application/json");
                headers.put("Authorization", auth);
                return headers;
            }

            @Override
            protected Response<String> parseNetworkResponse(NetworkResponse response) {
                String parsed;
                try {
                    parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
                } catch (UnsupportedEncodingException e) {
                    parsed = new String(response.data);
                }
                return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
            }
        };

        stringRequest.setRetryPolicy(new DefaultRetryPolicy(
                MY_SOCKET_TIMEOUT_MS,
                DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));

        requestQueue.add(stringRequest);
    }
}

Here is my response. You can see result has value.. but if I try to get it to bitmap it just doesn't work. Bitmap is null.

enter image description here

Here is code

HTTPRequest.call(TaskActivity.this, url, Request.Method.GET,
                                    new HTTPRequest.VolleyCallback() {
                                
   @Override
   public void onSuccess(String result) 
   {
       //bitmap is always null .. while result is not null
       Bitmap bitmap = BitmapFactory.decodeByteArray(result.getBytes(), 0, result.length()); 
   }

Any ideas?


Solution

  • Thanks to @f1sh comment I've managed to get it working with JsonArrayRequest from Volley.

    Here is procedure

    public static void callByte(final Context Context, String URL, Integer Type, final JSONObject jsonObject, final VolleyCallbackByte callback) {
            final RequestQueue requestQueue = Volley.newRequestQueue(Context);
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Type, /*baseUrl + */URL, null,
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        callback.onSuccessByte(response);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.printStackTrace();
                        requestQueue.stop();
    
                        if (error.networkResponse != null) {
                                callback.onErrorBitmap(error);
                        }
                        else {
                            callback.onError(error.getMessage());
                        }
                    }
                })
        {
    
            @Override
            public Map<String, String> getHeaders() throws AuthFailureError {
                Map<String, String> headers = new HashMap<>();
                String credentials = "lalaa";
                String auth = "Basic " + Base64.encodeToString(credentials.getBytes(), Base64.NO_WRAP);
                //headers.put("Content-Type", "application/json");
                headers.put("Authorization", auth);
                headers.put("Cache-Control", "no-cache");
                return headers;
            }
    
            @Override
            protected Response<JSONArray> parseNetworkResponse(NetworkResponse response) {
                try {
    
                    JSONArray jsonArray = new JSONArray();
                    for (int i = 0; i < response.data.length; i++) {
                        jsonArray.put(response.data[i]);
                    }
                    return Response.success(jsonArray,
                            HttpHeaderParser.parseCacheHeaders(response));
                } catch (Exception e) {
                    return Response.error(null);
                }
            }
        };
    
        requestQueue.add(jsonArrayRequest);
    }
    

    And here is my call

    HTTPRequest.callByte(TaskActivity.this, url, Request.Method.GET, null,
        new HTTPRequest.VolleyCallbackByte() {
            @Override
            public void onSuccessByte(JSONArray response) {
                Bitmap bitmap;
                try {
                    byte[] ola = new byte[response.length()];
                    for (int i = 0; i < response.length(); i++) {
                        ola[i] = (byte)response.getInt(i);
                    }
                    bitmap = BitmapFactory.decodeByteArray(ola, 0, response.length());
                    napakaSlika.setImageBitmap(bitmap);
                } catch (Exception e) {
                    Toast.makeText(TaskActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
                }
                String lala = "S";
            }
    
            @Override
            public void onErrorBitmap(VolleyError result) {
                Toast.makeText(TaskActivity.this, result.getMessage(), Toast.LENGTH_SHORT).show();
            }
    });