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()にブレークポイントを設定しましたが、ヒットすることはありませんか?私は何が間違っているのですか?

4

2 に答える 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();

独自の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);
于 2015-03-24T13:31:15.413 に答える
4

私はそれを最終的に機能させることができました...

例に付属しているソースでライブラリ.jarを使用し、デバッグしました。URLConnectionImageDownloader派生クラスにアクセスせず、常に親を使用していることがわかりました。

それで、私のコードを見て、デフォルトのURLConnectionImageDownloaderクラスを使用していた前のアクティビティ内に別のイメージローダーをセットアップしていることを確認しました。

これで、アプリケーションクラスを作成し、ImageLoaderを1回セットアップし(サンプルアプリのように)、新しいauthURLConnectionImageDownloaderクラスを使用するように構成を設定しました。これで、すべてのアクティビティでこのImageLoaderが使用され、機能します。

于 2012-11-27T16:01:45.083 に答える