Мое приложение использует изображения из источника HTTPS, они отлично загружаются на Android с API 21 или выше, но я не могу загрузить эти изображения в версиях Android из API 16 (минимальный API для моего приложения) в API 19 Есть ли способ включить TLS для старых версий Android? Кажется, что он включен по умолчанию на Lollipop и выше. Помощь будет оценена! Заранее спасибо :)Есть ли способ включить HTTPS-соединение в библиотеке Picasso на старых устройствах?
ответ
Есть ли способ включить TLS на старших версиях для Android?
TLS включен в Android с Android 1.0. Конкретные уровни TLS и конкретных корневых сертификатов менялись с годами (и, в случае сертификатов, могут даже отличаться в зависимости от производителя на более старых устройствах).
я не могу загрузить эти изображения на Android версии с API 16 (мин. API для моего приложения) к API 19
Проверить LogCat за исключением зарегистрированных Пикассо. Или запустите несколько тестов, где вы напрямую загружаете изображение (например, OkHttp, HttpURLConnection
), чтобы убедиться, что вы получаете исключения.
Затем, если вы не понимаете, как обращаться с этими исключениями, задайте отдельный вопрос о переполнении стека, в котором вы указываете minimum, complete, and verifiable example, в который будут включены ваш код, неудавшийся URL и трассировка стека Java, связанная с исключение.
Вы можете включить http2 в устройствах pre-KitKat, используя OKHttp.
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);
}
Кроме того, может быть, ваш сертификат или сервер не совместим с этими версиями (устаревшие или небезопасных протоколы отключены, например). Вы можете проверить с помощью [SSLLabs] (https://www.ssllabs.com) – maxoumime
Спасибо, я отправлю вопрос с кодом позже – Hamstersztyk