访问保护图像的通用图像加载器

5
我正在使用通用的图像加载器在一个需要从授权源获取图片的应用中。目前,我已经通过自己的类扩展了URLConnectionImageDownloader类,并覆盖了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()中设置了断点,却从未被触发?我哪里做错了吗?


感谢您的解决方案! :) - Sadegh
2个回答

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();

创建自己的图像下载器:

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);

createConnection上的额外参数总是返回null。 - Ricardo

4
最终我设法使其工作...
我使用了带有源代码的库.jar,并进行了调试。我发现它从未访问我的URLConnectionImageDownloader派生类,而总是使用父类。
于是我看了看我的代码,并发现我在以前的活动中设置了另一个imageloader,该活动使用默认的URLConnectionImageDownloader类。
现在我创建了一个应用程序类,并设置了我的ImageLoader(与示例应用程序中一样),并将配置设置为使用我的新authURLConnectionImageDownloader类。现在所有我的活动都使用这个ImageLoader,并且它可以正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接