【问题标题】: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);
}