ImageLoader 加载https图片报异常 SSLCertificateSocketFactory

来源:互联网 发布:apple mac.pro 病毒 编辑:程序博客网 时间:2024/04/27 21:45
近期在做项目时,以前使用的http,现在要用https,在使用的时候发现ImageLoader加载图片的时候有的图片加

载不出来,报SSLCertificateSocketFactory这个异常,网上搜说有人已经修改universalimageloader了,把这些配置弄好了,然后重新打包为universalimageloader,jar,解决了问题,但是我试试了还不行

解决方法:


1 重写 AuthImageDownloader

public class AuthImageDownloader extends BaseImageDownloader {    public static final String TAG = AuthImageDownloader.class.getName();    /**     * {@value}     */    public static final int DEFAULT_HTTP_CONNECT_TIMEOUT = 5 * 1000; // milliseconds    /**     * {@value}     */    public static final int DEFAULT_HTTP_READ_TIMEOUT = 20 * 1000; // milliseconds    public AuthImageDownloader(Context context) {        this(context, DEFAULT_HTTP_CONNECT_TIMEOUT, DEFAULT_HTTP_READ_TIMEOUT);    }    public AuthImageDownloader(Context context, int connectTimeout, int readTimeout) {        super(context, connectTimeout, readTimeout);    }    @Override    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() {        @Override        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() {            @Override            public void checkClientTrusted(                    java.security.cert.X509Certificate[] x509Certificates,                    String s) throws java.security.cert.CertificateException {            }            @Override            public void checkServerTrusted(                    java.security.cert.X509Certificate[] x509Certificates,                    String s) throws java.security.cert.CertificateException {            }            @Override            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();        }    }}
2 配置ImageLoader



ImageLoaderConfiguration config = new ImageLoaderConfiguration        .Builder(getApplicationContext())        .imageDownloader(new AuthImageDownloader(this))        .build();ImageLoader.getInstance().init(config);

0 0