2015-06-12 83 views
1

我有網絡圖像視圖,當我從服務器以JSON格式返回響應時,應該填充網絡圖像視圖。凌空網絡圖像查看和請求標頭

我在json中找回一個URL,我轉到URL並在Android的列表視圖中顯示圖像。但是,如果我使用公開託管在互聯網上的任何圖像,這可以很好地工作。

在我的情況下,服務器位於IBM Domino上,所有內容都位於多米諾骨牌數據庫中。 URL不會打開,除非我有用戶憑據來這樣做。

對於使用volley的一般請求響應,我在請求標頭中設置會話ID,告訴Domino服務器我已經對自己進行了身份驗證。但是,在網絡圖像視圖的情況下,我無法繼續,因爲我不知道如何使用服務器對自己進行身份驗證。

的影像不會在列表視圖中顯示,我看到我的logcat以下

SkImageDecoder::Factory returned null 

我試圖打開瀏覽器相同的URL,它要求我的用戶ID的密碼,如果我登錄,我我能夠在我的系統上下載JPG文件。

有沒有辦法爲網絡圖像視圖設置我的http請求標頭?在這種情況下我應該如何進行?請幫助

感謝

回答

6

NetworkImageView使用ImageLoader其使用makeImageRequest

ImageRequestRequest內部延伸,使ImageRequestsRequest類有一個允許設置請求標頭的getHeaders()方法。

所以,如果你可以重寫的ImageLoadermakeImageRequest方法,然後覆蓋getHeaders()ImageRequest裏面,你應該能夠設置你的請求頭爲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; 
     } 
    }; 
} 
+0

好的,所以我會寫我自己的自定義圖像加載器並重寫makeImageRequest? – k2ibegin

+0

試試看。讓我們看看它是如何去 – random

+0

現在我正在使用此 - mNetworkImageView.setImageUrl(IMAGE_URL,mImageLoader); ...我是否需要改變它並使用ImageRequest? – k2ibegin

0

我使用上述ImageLoader的嘗試,但couldn」似乎忽略了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 

     } 
    }; 

} 
    }