Volley ImageLoader对一些https url给出403响应



我在我的项目中使用Volley Library

我使用ImageLoader加载&显示https url.

例如:

ImageLoader mImageLoader;
ImageView mImageView;
// The URL for the image that is being loaded.
private static final String IMAGE_URL =
    "https://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);
// Get the ImageLoader through your singleton class.
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

部分图片加载成功,但不是全部。

对于一些图像,我得到以下错误响应:

BasicNetwork.performRequest: Unexpected response code 403 for https://developer.android.com/images/training/system-ui.png

有解决这个问题的办法吗?

我试过你的代码,但它似乎对我很好。

发送ImageRequest的方法:

 private void sendImageRequest() {
        final String IMAGE_URL =
                "https://developer.android.com/images/training/system-ui.png";
        ImageRequest request = new ImageRequest(IMAGE_URL,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        Log.e("Image Sucess", bitmap.toString());
//                        mImageView.setImageBitmap(bitmap);
                        imageView.setImageBitmap(bitmap);
                    }
                }, 0, 0, null,
                new Response.ErrorListener() {
                    public void onErrorResponse(VolleyError error) {
                        Log.e("Image Error", error.getMessage());
//                        mImageView.setImageResource(R.drawable.image_load_error);
                    }
                });
// Access the RequestQueue through your singleton class.
        Volley.newRequestQueue(getApplicationContext()).add(request);
    }

library in gradle:

  compile 'com.mcxiaoke.volley:library:1.0.19'

和Manifest.xml中的Internet权限

 <uses-permission android:name="android.permission.INTERNET" />

请用这个代码试试。

谢谢。

与我在上面对你的问题的评论一起,你可以在BasicNetwork.java中找到更多信息:

...
               } catch (IOException e) {
                    int statusCode = 0;
                    NetworkResponse networkResponse = null;
                    if (httpResponse != null) {
                        statusCode = httpResponse.getStatusLine().getStatusCode();
                    } else {
                        throw new NoConnectionError(e);
                    }
                    VolleyLog.e("Unexpected response code %d for %s", statusCode, request.getUrl());
                    if (responseContents != null) {
                        networkResponse = new NetworkResponse(statusCode, responseContents,
                                responseHeaders, false, SystemClock.elapsedRealtime() - requestStart);
                        if (statusCode == HttpStatus.SC_UNAUTHORIZED ||
                                statusCode == HttpStatus.SC_FORBIDDEN) {
                            attemptRetryOnException("auth",
                                    request, new AuthFailureError(networkResponse));
                        } else {
                            // TODO: Only throw ServerError for 5xx status codes.
                            throw new ServerError(networkResponse);
                        }
                    } else {
                        throw new NetworkError(networkResponse);
                    }
                }

如果响应代码为403 - FORBIDDEN,将调用attemptRetryOnException(),您将获得图像。

希望这对你有帮助!

不是VolleyImageLoader的故障。

实际上,我试图直接使用桶url访问amazon s3桶的图像。

虽然该url中不存在image,但当用户没有访问权限时,S3返回403而不是404。

由这个答案解决,查看更多细节

最新更新