我在从 API 获取图像时遇到问题。当我在 Postman 中观看响应并将其另存为图像时 - 它保存得很好并且是有效图像。但我无法让它在 java 中工作。
下面是我的 HTTPRequest 类
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);
}
}
这是我的回应。您可以看到结果具有价值……但如果我尝试将其转换为位图,它就无法正常工作。位图为空。
这是代码
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());
}
有什么想法吗?
感谢@f1sh 的评论,我已经设法让它与来自 Volley 的 JsonArrayRequest 一起工作。
这是程序
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);
}
这是我的电话
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();
}
});