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.
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?
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();
}
});