Как видно из , ваш API https://api.github.com поддерживает только TLS 1.2
. Ваше тестовое устройство может иметь версию Android 16+, а TLS 1.2
поддерживается на уровне API 16+, но не включено по умолчанию. Для 20+ устройств оно включено по умолчанию. Поэтому для 16<device<20
создайте пользовательский SSLSocketFactory
с включенным TLS 1.2
, как показано ниже
TLSSocketFactory.java
public class TLSSocketFactory extends SSLSocketFactory {
private SSLSocketFactory delegate;
public TLSSocketFactory() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, null, null);
delegate = context.getSocketFactory();
}
@Override
public String[] getDefaultCipherSuites() {
return delegate.getDefaultCipherSuites();
}
@Override
public String[] getSupportedCipherSuites() {
return delegate.getSupportedCipherSuites();
}
@Override
public Socket createSocket() throws IOException {
return enableTLSOnSocket(delegate.createSocket());
}
@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose));
}
@Override
public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
return enableTLSOnSocket(delegate.createSocket(host, port));
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException, UnknownHostException {
return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort));
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return enableTLSOnSocket(delegate.createSocket(host, port));
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort));
}
private Socket enableTLSOnSocket(Socket socket) {
if(socket != null && (socket instanceof SSLSocket)) {
((SSLSocket)socket).setEnabledProtocols(new String[] {"TLSv1.2"});
}
return socket;
}
}
Теперь создайте OkHttpClient
и добавьте client
для такой модификации
public void loadData (View view){
OkHttpClient client=new OkHttpClient();
try {
client = new OkHttpClient.Builder()
.sslSocketFactory(new TLSSocketFactory())
.build();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String LINK = "https://api.github.com";
Retrofit retrofit = new Retrofit.Builder ().client(client).baseUrl (LINK).build ();
GithubServise githubServise= retrofit.create (GithubServise.class);
githubServise.getGithub ().enqueue (new Callback<ResponseBody> () {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
textView.setText (response.body ().string ());
Log.v ("TAG","yes");
} catch (IOException e) {
e.printStackTrace ();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
textView.setText ("no data");
}
});
}