Android-universal-image-loader: [1.8.0] memoryCacheExtraOptionsは、値をURI(https)に付加します

作成日 2013年03月01日  ·  25コメント  ·  ソース: nostra13/Android-Universal-Image-Loader

.memoryCacheExtraOptions(512、512)を使用しています
これが望ましい効果かどうかはわかりませんが、Webリクエストを実行するときにこれを行うことで、画像の末尾にサイズが付加されるようになりました。

https://d3jpl91pxevbkh.cloudfront.net/notha/image/upload/v1360769665/1.png
になります
https://d3jpl91pxevbkh.cloudfront.net/notha/image/upload/v1360769665/1.png_512x512
もちろん、どちらがロードに失敗します。

乾杯、
クリス

Problem

最も参考になるコメント

http://stackoverflow.com/questions/14789716/android-universal-image-loader-change-hxw-url-parameters

httpsに問題があるかもしれません。次のクラスを試してください。

public class AuthImageDownloader extends BaseImageDownloader {
    public static final String TAG = AuthImageDownloader.class.getName();


    public AuthImageDownloader(Context context, int connectTimeout, int readTimeout) {
        super(context, connectTimeout, readTimeout);
    }

    <strong i="8">@Override</strong>
    protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {

        URL url = null;
        try {
            url = new URL(imageUri);
        } catch (MalformedURLException e) {
            Log.e(TAG, e.getMessage(), e);
        }
        HttpURLConnection http = null;

        if (Scheme.ofUri(imageUri) == Scheme.HTTPS) {
            trustAllHosts();
            HttpsURLConnection https = (HttpsURLConnection) url
                    .openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            http = https;
            http.connect();
        } else {
            http = (HttpURLConnection) url.openConnection();
        }

        http.setConnectTimeout(connectTimeout);
        http.setReadTimeout(readTimeout);
        return new FlushedInputStream(new BufferedInputStream(
                http.getInputStream()));
    }

    // always verify the host - dont check for certificate
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        <strong i="9">@Override</strong>
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    /**
     * Trust every server - dont check for any certificate
     */
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            <strong i="10">@Override</strong>
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] x509Certificates,
                    String s) throws java.security.cert.CertificateException {
            }

            <strong i="11">@Override</strong>
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] x509Certificates,
                    String s) throws java.security.cert.CertificateException {
            }

            <strong i="12">@Override</strong>
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }
        } };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

全てのコメント25件

http://stackoverflow.com/questions/14789716/android-universal-image-loader-change-hxw-url-parameters

httpsに問題があるかもしれません。次のクラスを試してください。

public class AuthImageDownloader extends BaseImageDownloader {
    public static final String TAG = AuthImageDownloader.class.getName();


    public AuthImageDownloader(Context context, int connectTimeout, int readTimeout) {
        super(context, connectTimeout, readTimeout);
    }

    <strong i="8">@Override</strong>
    protected InputStream getStreamFromNetwork(String imageUri, Object extra) throws IOException {

        URL url = null;
        try {
            url = new URL(imageUri);
        } catch (MalformedURLException e) {
            Log.e(TAG, e.getMessage(), e);
        }
        HttpURLConnection http = null;

        if (Scheme.ofUri(imageUri) == Scheme.HTTPS) {
            trustAllHosts();
            HttpsURLConnection https = (HttpsURLConnection) url
                    .openConnection();
            https.setHostnameVerifier(DO_NOT_VERIFY);
            http = https;
            http.connect();
        } else {
            http = (HttpURLConnection) url.openConnection();
        }

        http.setConnectTimeout(connectTimeout);
        http.setReadTimeout(readTimeout);
        return new FlushedInputStream(new BufferedInputStream(
                http.getInputStream()));
    }

    // always verify the host - dont check for certificate
    final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
        <strong i="9">@Override</strong>
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    };

    /**
     * Trust every server - dont check for any certificate
     */
    private static void trustAllHosts() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            <strong i="10">@Override</strong>
            public void checkClientTrusted(
                    java.security.cert.X509Certificate[] x509Certificates,
                    String s) throws java.security.cert.CertificateException {
            }

            <strong i="11">@Override</strong>
            public void checkServerTrusted(
                    java.security.cert.X509Certificate[] x509Certificates,
                    String s) throws java.security.cert.CertificateException {
            }

            <strong i="12">@Override</strong>
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return new java.security.cert.X509Certificate[] {};
            }
        } };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            HttpsURLConnection
                    .setDefaultSSLSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

SSLとは何の関係もありません。この行は、実際には添付されたUrlを返します。これが、イメージローダーが失敗する理由です。
(https://d3jpl91pxevbkh.cloudfront.net/notha/image/upload/v1360769665/1.png_512x512これはもちろん悪いです)。

    <strong i="7">@Override</strong>
    protected InputStream getStreamFromNetwork(URI imageUri, Object extra) throws IOException {
      Log.d(TAG, "URL="+imageUri.toString());
      //...
    }

フォークで修正する方法を見ていきます。 特定のフローにより、リクエストの間違った部分のプレフィックスが付けられるようです。

理由はわかりましたか?

今週末は調査する機会がありませんでした
2013年3月8日09:35、「SergeyTarasevich」 [email protected]は次のように書いています。

理由はわかりましたか?


このメールに直接返信するか、Gi tHubhttps://github.com/nostra13/Android-Universal-Image-Loader/issues/188#issuecomment-14611118で表示してください

こんにちは@ nostra13@chrisjenx 、私は同様の問題、ユニバーサルイメージダウンローダーとSSLを持っています。

以前に投稿したクラスを使用したいのですが、getStreamFromNetworkをオーバーライドするという点で:

パブリッククラスAuthImageDownloaderはBaseImageDownloaderを拡張します{
..。
@オーバーライド
保護されたInputStreamgetStreamFromNetwork(URI imageUri、Object extra)はIOException {をスローします
..。
}

このエラーが発生し、修正方法がわかりません。

タイプAuthImageDownloaderのメソッドgetStreamFromNetwork(URI、Object)は、スーパータイプメソッドをオーバーライドまたは実装する必要があります

簡単な修正は、「@ Override」アノテーションを削除することです。 しかし、もちろん機能しません。

ありがとう。

正しいメソッドがオーバーライドされていることを確認してください。

Eclipseがオーバーライドアノテーションでエラーをスローしている場合は、正しいクラスをオーバーライド/拡張​​していないため、エラーが発生していることを意味します。

ImageDownloaderはAPIを変更し、URIの代わりに文字列を使用します。 コメントを更新しました。

素晴らしい、今は完璧に動作します。

ありがとう、両方がとても速く答える方法は信じられないほどです。 ^^

これは、上記のバグに対する私の回避策です。

package com.bizzby.http.requests;

import android.content.Context;
import android.text.TextUtils;
import com.bizzby.utils.QLog;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.http.*;
import com.nostra13.universalimageloader.core.assist.FlushedInputStream;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created with Intellij with Android, BIZZBY product.
 * See licencing for usage of this code.
 * <p/>
 * User: chris
 * Date: 01/03/2013
 * Time: 15:45
 */
public class GoogleImageDownloader extends BaseImageDownloader
{

    protected static final Pattern SIZE_PATTERN = Pattern.compile("(_[0-9]+(_|x)[0-9]+)$", Pattern.CASE_INSENSITIVE);
    public static HttpTransport sHttpTransport;
    public static HttpRequestFactory sHttpRequestFactory;

    public static HttpRequest getHttpRequest(final String uri) throws IOException
    {
        if (sHttpTransport == null) sHttpTransport = AndroidHttp.newCompatibleTransport();
        if (sHttpRequestFactory == null) sHttpRequestFactory = sHttpTransport.createRequestFactory();
        return sHttpRequestFactory.buildGetRequest(new GenericUrl(uri));
    }

    private static String replaceLast(final String string, final String from, final String to)
    {
        int lastIndex = string.lastIndexOf(from);
        if (lastIndex < 0) return string;
        final String tail = string.substring(lastIndex).replaceFirst(from, to);
        return string.substring(0, lastIndex) + tail;
    }

    static String stripSizeOffUrl(final String string)
    {
        if (TextUtils.isEmpty(string)) return string;
        final Matcher matcher = SIZE_PATTERN.matcher(string);
        String group = "";
        while (matcher.find())
        {
            group = matcher.group(1);
        }
        return replaceLast(string, group, "");

    }

    public GoogleImageDownloader(final Context context)
    {
        super(context);
    }

    public GoogleImageDownloader(final Context context, final int connectTimeout, final int readTimeout)
    {
        super(context, connectTimeout, readTimeout);
    }

    <strong i="6">@Override</strong>
    protected InputStream getStreamFromContent(URI imageUri, final Object extra) throws FileNotFoundException
    {
        imageUri = URI.create(stripSizeOffUrl(imageUri.toString()));
        return super.getStreamFromContent(imageUri, extra);
    }

    <strong i="7">@Override</strong>
    protected InputStream getStreamFromNetwork(final URI imageUri, final Object extra) throws IOException
    {
        if (null == imageUri) return null;
        final String url = stripSizeOffUrl(imageUri.toString());
        QLog.i("ImageLoader, Downloading [" + url + "]");
        final HttpRequest request = getHttpRequest(url);
        request.setConnectTimeout(connectTimeout);
        request.setReadTimeout(readTimeout);
        final HttpResponse response = request.execute();
        if (response != null && response.isSuccessStatusCode())
        {
            return new FlushedInputStream(response.getContent(), BUFFER_SIZE);
        }
        return null;
    }
}

この原因はまだ私のリストにあります。

私もこの問題を抱えています-これは楽しいことではありません-そしてなぜこのスレッドは閉じているとマークされていますか?

@doridoriは閉じているとマークされていませんが、これを参照している他の#163は閉じています。

すみません、私の悪い

@chrisjenxのバグ修正は

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
                .imageDownloader(new CustomImageDownloader(context)) //bug fix

それがどのように起こり得るのかまだ理解できません。

Nostra、httpsと上記のソリューション(AuthImageDownloaderクラスを使用)に問題があります。
問題はメソッドencodeCredentials()にあり、Configuration.getInstance()のメソッドが未定義であると表示されます。

public static String encodeCredentials() {
       try {
           Configuration configuration = Configuration.getInstance();
           String auth = android.util.Base64.encodeToString((configuration.getHttpAuthLogin()
                + ":" + configuration.getHttpAuthPassword()).getBytes("UTF-8"),
                android.util.Base64.NO_WRAP);
           return auth;
       } catch (Exception ignored) {
           Log.e(TAG, ignored.getMessage(), ignored);
       }
       return "";
   }

私は何かが足りないのですか? 上記のコードに必要なインポートは何ですか?
android.content.res.Configurationをインポートすると、さらに多くのエラーが発生しますか?

この認証は、必要な場合にのみ使用してください。 私はあなたがそうしないと思います。 AuthImageDownloaderコードを更新しました。チェックしてください。

動作します! 私はそれを機能させるために以下のコードを使用しました:

   ImageLoaderimageLoader = ImageLoader.getInstance();

    DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
            .cacheInMemory()
            .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2).build();

    Builder configBuilder = new ImageLoaderConfiguration.Builder(getActivity());
    configBuilder.imageDownloader(new AuthImageDownloader(getActivity(), 1000, 1000));
    configBuilder.defaultDisplayImageOptions(defaultOptions);
    ImageLoaderConfiguration config=configBuilder.build();

    imageLoader.init(config);

迅速な回答ありがとうございます。

これは閉じているようですが、URLの末尾にディメンションが追加されていませんか?

以前は寸法を追加していませんでした。 私はバグを再現することができず、なぜそれが起こり得るのか想像できませんでした。 chrisjenxはそれを調べることを約束しましたが、彼は私が推測しませんでした。 このバグがある場合は、このバグを含むプロジェクトを送っていただければ、調査します。

このバグはまだ非常に活発です。 私は郡外にいるので、修正する機会はありません。
Doriは1.8.2で確認できますか?それでも問題があるかどうかを確認してください。

クリス。
2013年4月10日16:24、「SergeyTarasevich」 [email protected]は次のように書いています。

以前は寸法を追加していませんでした。 バグを再現できず、
なぜそれが起こり得るのか想像できませんでした。 chrisjenxはそれを調べることを約束しましたが
彼は私が推測しませんでした。 このバグがある場合は、プロジェクトを送ってください
このバグがあるので、調べてみます。


このメールに直接返信するか、Gi tHubhttps://github.com/nostra13/Android-Universal-Image-Loader/issues/188#issuecomment-16199551で表示してください

リンク内の1.9.3とhttpsでこの問題が発生しました。 コメントからAuthImageDownloaderを使用します。

提案されたように、私はAuthImageDownloaderを使用してSSL証明書エラーを無視しようとしました。 しかし、log catからは、AuthImageDownloaderオーバーライドメソッドが呼び出されていないようで、同じsslエラーが発生します。
ImageLoaderConfigurationで「.imageDownloader(newAuthImageDownloader(getApplicationContext()、5000,5000))」をすでに設定しています。
助けてください!

1.9.4でこの問題が発生しました....それを解決する方法???

誰かが修正を見つけましたか? できるだけ早く必要です。

@ nostra13あなたのコードはうまく機能します、ありがとう
ps:私が使用しているUILのバージョンは1.9.5です。

このページは役に立ちましたか?
0 / 5 - 0 評価