Volley 从 API 获取图像

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

我在从 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()); 
   }

有什么想法吗?

java android android-volley
1个回答
0
投票

感谢@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();
        }
});
© www.soinside.com 2019 - 2024. All rights reserved.