Android-Picassoはhttpsにネットワークピクチャが表示できないソリューションをロードするように要求した.
compile 'com.squareup.okhttp3:okhttp:3.9.0'
compile 'com.squareup.picasso:picasso:2.5.2'
ImageDownLoader
実装com.squareup.picasso.Downloader
コードは以下の通りである: package china.test.helper;
import android.net.Uri;
import com.squareup.picasso.Downloader;
import com.squareup.picasso.NetworkPolicy;
import java.io.IOException;
import okhttp3.Cache;
import okhttp3.CacheControl;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import okhttp3.Request;
/**
* Created by benchengzhou on 2017/11/14 13:52 .
* : [email protected]
* : picasso , okhttp3
* : ImageDownLoader
* :
*/
public class ImageDownLoader implements Downloader {
/* OkHttpClient client = new OkHttpClient.Builder()
.protocols(Collections.singletonList(Protocol.HTTP_1_1))
.build();*/
private OkHttpClient client= null;
public ImageDownLoader(OkHttpClient okHttpClient) {
this.client = okHttpClient;
}
@Override
public Response load(Uri uri, int networkPolicy) throws IOException {
CacheControl cacheControl = null;
if (networkPolicy != 0) {
if (NetworkPolicy.isOfflineOnly(networkPolicy)) {
cacheControl = CacheControl.FORCE_CACHE;
} else {
CacheControl.Builder builder = new CacheControl.Builder();
if (!NetworkPolicy.shouldReadFromDiskCache(networkPolicy)) {
builder.noCache();
}
if (!NetworkPolicy.shouldWriteToDiskCache(networkPolicy)) {
builder.noStore();
}
cacheControl = builder.build();
}
}
Request.Builder builder = new Request.Builder().url(uri.toString());
if (cacheControl != null) {
builder.cacheControl(cacheControl);
}
okhttp3.Response response = client.newCall(builder.build()).execute();
int responseCode = response.code();
if (responseCode >= 300) {
response.body().close();
throw new ResponseException(responseCode + " " + response.message(), networkPolicy,
responseCode);
}
boolean fromCache = response.cacheResponse() != null;
ResponseBody responseBody = response.body();
return new Response(responseBody.byteStream(), fromCache, responseBody.contentLength());
}
@Override
public void shutdown() {
Cache cache = client.cache();
if (cache != null) {
try {
cache.close();
} catch (IOException ignored) {
}
}
}
}
/**
* picasso okhttp
*/
private void initPicasso() {
Picasso.setSingletonInstance(new Picasso.Builder(this).
downloader(new ImageDownLoader(getSOkHttpClient())).loggingEnabled(true)
.build());
}
getSOkHttpClient()
のコード/**
* OkHttpClient
*
* OkHttpClient , ,
* OkHttpClient , 。 Request
*
* @return
*/
public static OkHttpClient getSOkHttpClient() {
// okhttp http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html
if (sOkHttpClient == null) {
sOkHttpClient =
new OkHttpClient.Builder()
.readTimeout(20000, TimeUnit.SECONDS)//
.writeTimeout(20000, TimeUnit.SECONDS)//
.connectTimeout(20000, TimeUnit.SECONDS)//
.sslSocketFactory(createSSLSocketFactory()) //
.hostnameVerifier(new HostnameVerifier() { //
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
.build();
}
return sOkHttpClient;
}
.sslSocketFactory(createSSLSocketFactory()) //
.hostnameVerifier(new HostnameVerifier() { //
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})
createSSLSocketFactory
メソッドにおける信頼ルール /**
* https
* okhttp
*
* @return
*/
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}
package china.test.helper;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;
/**
* Created by benchengzhou on 2017/11/13 10:09 .
* : [email protected]
* : https
* : TrustAllCerts
* :
*/
public class TrustAllCerts implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {}
@Override
public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
}
ドキュメントを参照すると、OKhttpはダウンロードを設定することができます.つまり、ダウンロードを指定したりカスタマイズしたりすることができます.ドキュメントにはこの言葉があります.
downloader(Downloader downloader) :
, okhttp volley, Downloader 。
これは文章のリンクです.http://blog.csdn.net/u011228356/article/details/45026441興味のある学生は研究してもいい,ここでは深く研究しない.
だからこそ、私たちは以下のように実現することができます.
picassoBuilder.downloader(new ImageDownLoader(client));
OKhttpをネットワークダウンロード機として使用することを指定したので、問題はokhttpがhttpを実現することができる限りhttpsの要求を実現することができる私たちのPicassoはhttpのピクチャーをロードすることを完成することができますOKhttpを見てhttpの要求を実現するなら私のブログに移動してください
参考リンク:Picassoがhttpsの画像をロードしてロードできない解決策とhttp://blog.csdn.net/qq_15037349/article/details/54089249
これ以上感謝する