android_https踩坑(2)android自签名证书Glide加载不出图片

Android https踩坑(2)Android无法访问自签名证书的服务器

    关于https中自签名证书的介绍以及OkHttp中解决自签名证书问题,可以参考鸿洋的这篇博客http://blog.csdn.net/lmj623565791/article/details/48129405   本文主要介绍okhttp,glide,webview中无法访问使用自签名证书服务器的问题。
OkHttp

Glide

在使用Glide时如果遇到自签名证书的请求会出现图片无法加载的问题。好在Glide允许自定义使用OkHttp进行图片下载。需要添加如下三个类,在第三个类中使用到的HttpUtils即为我在第一篇文章中提到的类:


public class OkHttpGlideModule implements GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder builder) {
        // Do nothing.
     }
    @Override
    public void registerComponents(Context context, Glide glide) {
         glide.register(GlideUrl.class, InputStream.class, new      OkHttpUrlLoader.Factory());
    }
}

public class OkHttpStreamFetcher implements DataFetcher<InputStream> {
private final OkHttpClient client;
private final GlideUrl url;
private InputStream stream;
private ResponseBody responseBody;
public OkHttpStreamFetcher(OkHttpClient client, GlideUrl url) {
    this.client = client;
    this.url = url;
}
@Override
public InputStream loadData(Priority priority) throws Exception {
    Request.Builder requestBuilder = new Request.Builder()
            .url(url.toStringUrl());

    for (Map.Entry<String, String> headerEntry : url.getHeaders().entrySet()) {
        String key = headerEntry.getKey();
        requestBuilder.addHeader(key, headerEntry.getValue());
    }

    Request request = requestBuilder.build();

    Response response = client.newCall(request).execute();
    responseBody = response.body();
    if (!response.isSuccessful()) {
        throw new IOException("Request failed with code: " + response.code());
    }

    long contentLength = responseBody.contentLength();
    stream = ContentLengthInputStream.obtain(responseBody.byteStream(), contentLength);
    return stream;
}

@Override
public void cleanup() {
    if (stream != null) {
        try {
            stream.close();
        } catch (IOException e) {
            // Ignored
        }
    }
    if (responseBody != null) {
        try {
            responseBody.close();
        } catch (IOException e) {
            // Ignored.
        }
    }
}

@Override
public String getId() {
    return url.getCacheKey();
}

@Override
public void cancel() {
    // TODO: call cancel on the client when this method is called on a background thread. See #257
}

public class OkHttpUrlLoader implements ModelLoader<GlideUrl, InputStream> {
/**
 * The default factory for {@link OkHttpUrlLoader}s.
 */
public static class Factory implements ModelLoaderFactory<GlideUrl, InputStream> {
    private static volatile OkHttpClient internalClient;
    private OkHttpClient client;

    private static OkHttpClient getInternalClient() {
        if (internalClient == null) {
            synchronized (OkHttpUrlLoader.Factory.class) {
                if (internalClient == null) {
                    internalClient = new OkHttpClient();
                    internalClient.setSslSocketFactory(HttpUtils.createSSLSocketFactory());
                    internalClient.setHostnameVerifier(new HttpUtils.TrustAllHostnameVerifier());
                }
            }
        }
        return internalClient;
    }

    /**
     * Constructor for a new Factory that runs requests using a static singleton client.
     */
    public Factory() {
        this(getInternalClient());
    }

    /**
     * Constructor for a new Factory that runs requests using given client.
     */
    public Factory(OkHttpClient client) {
        this.client = client;
    }

    @Override
    public ModelLoader<GlideUrl, InputStream> build(Context context, GenericLoaderFactory factories) {
        return new OkHttpUrlLoader(client);
    }

    @Override
    public void teardown() {
        // Do nothing, this instance doesn't own the client.
    }
}

    private final OkHttpClient client;

    public OkHttpUrlLoader(OkHttpClient client) {
       this.client = client;
     }

    @Override
    public DataFetcher<InputStream> getResourceFetcher(GlideUrl model, int width,           int height) {
        return new OkHttpStreamFetcher(client, model);
    }
}

最后需要在AndroidManifest.xml Application下添加如下内容
<meta-data
android:name="com.hand.hrms.utils.okhttpforglide.OkHttpGlideModule"
android:value="GlideModule" />


webview
待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值