Android-Picassoはhttpsにネットワークピクチャが表示できないソリューションをロードするように要求した.

7489 ワード

Picassoがhttpsのピクチャーをロードしてロードできない解決策をロードします
  • 最近のプロジェクトでは、httpリンクの画像を表示する必要がありますが、パスを設定すると元のPicassoが死んで画像をロードできません.最後に、ネット上で次のような解決策を見つけました.
  • 依存の確認
  • 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) {
                    }
                }
            }
        }
    
  • 2.Picasso初期化構成を解決するには、カスタムDownloaderを使用して、アプリケーションに初期化構成コード
    /**
     *     picasso  okhttp        
     */
    private void initPicasso() {
    
        Picasso.setSingletonInstance(new Picasso.Builder(this).
        downloader(new ImageDownLoader(getSOkHttpClient())).loggingEnabled(true)
        .build());
    
    }
    
  • を追加します.
  • 3. 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; }

  • 3.1ここのOkHttpClientオブジェクトはグローバルに1つ使用され、同時にプロジェクトのokhttpのネットワーク要求であるOkHttpClientのカプセル化が可能であり、私のプロジェクト内のネットワーク要求もこの
  • を使用している.
  • そのうち
        .sslSocketFactory(createSSLSocketFactory())    //        
                                .hostnameVerifier(new HostnameVerifier() {     //        
                                    @Override
                                    public boolean verify(String hostname, SSLSession session) {
                                        return true;
                                    }
                                })
    
  • はhttpsプロトコルのサポートを追加した
  • である.
  • 4. 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;
        }
    
  • の追加
  • 5.行のファイルを作成するJAva構成に対応する信頼ルール
    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];}
    }
    

  • OK!あとはゆっくり使いましょうgo
  • 問題が解決したら見逃して原理を見てみましょう
    ドキュメントを参照すると、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の要求を実現するなら私のブログに移動してください
  • もちろん私の今のプロジェクトのbuild配置は以下の通りです:compile'com.squareup.okhttp3:okhttp:3.5.0’ compile ‘com.squareup.picasso:picasso:2.3.2’

  • 参考リンク:Picassoがhttpsの画像をロードしてロードできない解決策とhttp://blog.csdn.net/qq_15037349/article/details/54089249
    これ以上感謝する