Picasso 不加载一些 URL (包括 http:// 或 https://)

Picasso does not load some URL (included http:// or https://)

我正在使用 Picasso 库版本 2.71828 加载一些图像,但它不适用于所有 URL。这是我的代码:

Picasso.get().load(url).into(imageView);

url1: https://res.cloudinary.com/lastminute/image/upload/c_scale,w_630/v1431701424/52347407_Casino_Tower_2100x1400_pyzvxz.jpg

url2: http://images.foody.vn/res/g14/138986/prof/s576x330/foody-mobile-a2-jpg-261-635682356468932282.jpg

url3: https://static3.mytour.vn/resources/pictures/hotels/19/large_vlj1419841660_khach-san-gia-han.JPG

Picasso 仅适用于 url1url2。它不显示带有 url3 的图像,即使我可以在浏览器上打开它。

为什么我可以用 Picasso 加载 url3? Picasso 不加载哪些类型的url?

我能看到的唯一区别是格式。
为了澄清

.jpg // working
.JPG // not working

我想如果您以 .jpg 格式上传相同的图片,它就可以了。

希望对您有所帮助!!

Picasso 直接不支持https。所以你必须合并这个包。

compile 'com.squareup.okhttp:okhttp:2.2.0'
compile 'com.squareup.okhttp:okhttp-urlconnection:2.2.0'
compile 'com.squareup.picasso:picasso:2.4.0'

并添加 picasso 自定义 class 来处理 https。

public class PicassoTrustAll {

    private static Picasso mInstance = null;

    private PicassoTrustAll(Context context) {
        OkHttpClient client = new OkHttpClient();
        client.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String s, SSLSession sslSession) {
                return true;
            }
        });
        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[] {};
            }
        } };
        try {
            SSLContext sc = SSLContext.getInstance("TLS");
            sc.init(null, trustAllCerts, new java.security.SecureRandom());
            client.setSslSocketFactory(sc.getSocketFactory());
        } catch (Exception e) {
            e.printStackTrace();
        }

        mInstance = new Picasso.Builder(context)
                .downloader(new OkHttpDownloader(client))
                .listener(new Picasso.Listener() {
                    @Override
                    public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) {
                        Log.e("PICASSO", exception);
                    }
                }).build();

    }

    public static Picasso getInstance(Context context) {
        if (mInstance == null) {
             new PicassoTrustAll(context);
        }
        return mInstance;
    }
}

终于像那样使用class。

PicassoTrustAll.getInstance(context)
                .load(url)
                .into(imageView);

Please check This reference

Read Reason behind https

您可以使用 Universal Image Loader 来实现这一点。原因是 Picasso 不支持 "https"。 Check out this link for reference.