2012-11-27 35 views
5

我在需要獲取圖像授權來源的應用程序中使用通用圖像加載程序。在通用圖像加載程序中訪問受保護的圖像

到目前爲止,我已經擴展了我自己的類的URLConnectionImageDownloader類,並重寫我自己implemetation方法getStreamFromNetwork,設置授權頭中的URLConnection對象爲這樣:

public class authURLConnectionImageDownloader extends URLConnectionImageDownloader { 

@Override 
public InputStream getStreamFromNetwork(URI imageUri) throws IOException { 

    String auth = Base64.encodeToString(("username" + ":"+"psswd").getBytes(), Base64.NO_WRAP); 

    URLConnection conn = imageUri.toURL().openConnection(); 
    conn.setRequestProperty("Authorization", "Basic " + auth); 

    conn.setConnectTimeout(DEFAULT_HTTP_CONNECT_TIMEOUT); 
    conn.setReadTimeout(DEFAULT_HTTP_READ_TIMEOUT); 

    return new FlushedInputStream(new BufferedInputStream(conn.getInputStream(), BUFFER_SIZE));  
} 

,並設立我ImageLoader的...

imageLoader = ImageLoader.getInstance(); 

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(MainActivity.this) 
     .imageDownloader(new authURLConnectionImageDownloader()) 
     .build(); 

imageLoader.init(config); 

到目前爲止,我有無法得到它的工作。該圖像未被下載。但更重要的是,我在getStreamFromNetwork()中放置了一個斷點,它從來沒有被打過?我究竟做錯了什麼?

+0

感謝解決方案! :) – Sadegh

回答

4

我設法得到它到底工作...

我用源庫的.jar自帶的例子,調試它。我看到它永遠不會訪問我的URLConnectionImageDownloader派生類,並始終使用父類。

所以看了看我的代碼,看到我在之前使用默認URLConnectionImageDownloader類的活動中設置了另一個圖像加載器。

現在我創建了一個應用程序類並設置了我的ImageLoader一次(如示例應用程序中),並將配置設置爲使用我的新authURLConnectionImageDownloader類。現在我所有的活動都使用這個ImageLoader,它可以工作。

12

我實現了這種方式:

byte[] toEncrypt = (username + ":" + password).getBytes(); 
     String encryptedCredentials = Base64.encodeToString(toEncrypt, Base64.DEFAULT); 
     Map<String, String> headers = new HashMap(); 
     headers.put("Authorization","Basic "+encryptedCredentials); 

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
      ... 
      .extraForDownloader(headers) 
      .build(); 

創建自己的ImageDownloader:

public class AuthDownloader extends BaseImageDownloader { 

    public AuthDownloader(Context context){ 
     super(context); 
    } 

    @Override 
    protected HttpURLConnection createConnection(String url, Object extra) throws IOException { 
     HttpURLConnection conn = super.createConnection(url, extra); 
     Map<String, String> headers = (Map<String, String>) extra; 
     if (headers != null) { 
      for (Map.Entry<String, String> header : headers.entrySet()) { 
       conn.setRequestProperty(header.getKey(), header.getValue()); 
      } 
     } 
     return conn; 
    } 
} 

並將其設置爲配置:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
      .defaultDisplayImageOptions(defaultOptions) 
      .discCacheExtraOptions(600, 600, CompressFormat.PNG, 75, null) 
      .imageDownloader(new AuthDownloader(getApplicationContext())) 
      .build(); 

    ImageLoader.getInstance().init(config); 
+0

createConnection上的額外參數總是返回null。 – Ricardo

+0

作品完美。你拯救我的一天。非常感謝。 –

相關問題