凌空网络图像查看和请求headers

volley network image view and request headers

我有网络图像视图,当我以 JSON 格式从服务器收到响应时应该填充它。

我在 json 中取回 URL,然后转到 URL 并在 android 中的列表视图中显示图像。但是,如果我使用任何在互联网上公开托管的图像,这就可以正常工作。

在我的案例中,服务器在 IBM Domino 上,所有内容都在 domino 数据库中。 URL 不会打开,除非我有用户凭据才能打开。

对于使用 volley 的一般请求响应,我在请求 headers 中设置了一个 session ID,告诉 domino 服务器我已经对自己进行了身份验证。但是,在网络图像视图的情况下,我无法继续,因为我不知道如何向服务器验证自己的身份。

图像未显示在列表视图中,我在 logcat

中看到以下内容
SkImageDecoder::Factory returned null 

我试图在浏览器中打开相同的 URL,它要求我输入用户 ID 密码,如果我登录,我可以在我的系统上下载 jpg 文件。

有没有办法为网络图像视图设置我的 http 请求 headers?在这种情况下我该如何处理?请帮助

谢谢

NetworkImageView 使用 ImageLoader which internally makes ImageRequests 使用 makeImageRequest

ImageRequest extends from RequestRequest class 有一个 getHeaders() 方法允许设置请求 headers。

因此,如果您可以覆盖 ImageLoadermakeImageRequest 方法,然后在其中覆盖 ImageRequestgetHeaders(),您应该能够设置您的请求 headers 对于 NetworkImageView

@Override
protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight, final String cacheKey) {
    //return super.makeImageRequest(requestUrl, maxWidth, maxHeight, cacheKey);

    return new ImageRequest(requestUrl, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
            onGetImageSuccess(cacheKey, response);
        }
    }, maxWidth, maxHeight,
            Bitmap.Config.RGB_565, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            onGetImageError(cacheKey, error);
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            HashMap<String, String> params = new HashMap<String, String>();
            params.put("Authorization", YOUR_TOKEN);
            return params;
        }
    };
}

我尝试使用上面的 ImageLoader,但似乎无法覆盖 makeImageRequest 方法。

在查看 Volley 实现时,我看不到相同的方法签名,所以我使用了 @random 的相同方法 - 这是我的 CustomImageLoader.

public class CustomImageLoader extends ImageLoader {

private Context mContext;

/**
 * Constructs a new ImageLoader.
 *
 * @param queue      The RequestQueue to use for making image requests.
 * @param imageCache The cache to use as an L1 cache.
 */
public CustomImageLoader(Context aContext, RequestQueue queue, ImageCache imageCache) {
    super(queue, imageCache);
    mContext = aContext;
}


@Override
protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight,
                                           ImageView.ScaleType scaleType, final String cacheKey,
                                           final ImageRequest.Transformation transformation) {

    return new ImageRequest(requestUrl, new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
            onGetImageSuccess(cacheKey, response);
        }
    }, maxWidth, maxHeight, scaleType, Bitmap.Config.RGB_565, transformation, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            onGetImageError(cacheKey, error);
        }
    }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            return getHeaders(mContext); //*YOUR* method for getting headers

        }
    };

}
  }