【问题标题】:Is there a way to enable HTTPS connection in Picasso library on older devices?有没有办法在旧设备上的 Picasso 库中启用 HTTPS 连接?
【发布时间】:2017-02-09 21:30:41
【问题描述】:

我的应用正在使用来自 HTTPS 源的图像,它们可以在 API 21 或更高版本的 Android 上正常加载,但我无法在从 API 16(我的应用的最低 API)到 API 的 Android 版本上加载这些图像19. 有什么方法可以在较旧的 Android 版本上启用 TLS?似乎它在 Lollipop 及更高版本上默认启用。帮助将不胜感激!在此先感谢:)

【问题讨论】:

    标签: java android https picasso


    【解决方案1】:

    有没有办法在旧版 Android 上启用 TLS?

    自 Android 1.0 起,TLS 已在 Android 中启用。多年来,特定级别的 TLS 和特定根证书有所不同(就证书而言,甚至可能因旧设备上的制造商而异)。

    我无法在从 API 16(我的应用的最低 API)到 API 19 的 Android 版本上加载这些图像

    检查 LogCat 以获取 Picasso 记录的异常。或者,在直接下载图像的地方运行一些测试(例如,OkHttp、HttpURLConnection),以确保获得异常。

    然后,如果您不了解如何解决这些异常,请提出一个单独的 Stack Overflow 问题,在其中提供 minimum, complete, and verifiable example,其中将包括您的代码、失败的 URL 以及与相关联的 Java 堆栈跟踪例外。

    【讨论】:

    • 另外,您的证书或服务器可能与这些版本不兼容(例如禁用过时或不安全的协议)。您可以通过SSLLabs 查询
    【解决方案2】:

    您可以使用 OKHttp 在 KitKat 之前的设备中启用 http2。

     List<Protocol> protocols = new ArrayList<>();
                protocols.add(Protocol.HTTP_2);
                protocols.add(Protocol.HTTP_1_1);
    
    
    
                SSLContext sc = SSLContext.getInstance("TLSv1.2");
                sc.init(null, null, null);
    
                ConnectionSpec cs = new ConnectionSpec.Builder(ConnectionSpec.MODERN_TLS)
                        .tlsVersions(TlsVersion.TLS_1_2)
                        .build();
    
                List<ConnectionSpec> specs = new ArrayList<>();
                specs.add(cs);
                specs.add(ConnectionSpec.COMPATIBLE_TLS);
                specs.add(ConnectionSpec.CLEARTEXT);
    
                mClient = new OkHttpClient.Builder()
                        .protocols(protocols)
                        .connectionSpecs(specs)
                        .sslSocketFactory(new Tls12SocketFactory(sc.getSocketFactory()))
                        .build();
    

    将此客户添加到毕加索

    if (android.os.Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
                    Picasso picasso = new Picasso.Builder(getApplicationContext())
                            .downloader(new OkHttp3Downloader(mClient))
                            .build();
                    Picasso.setSingletonInstance(picasso);
                }
    

    【讨论】:

      猜你喜欢
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2017-08-21
      • 1970-01-01
      • 2020-09-16
      相关资源
      最近更新 更多