为了账号安全,请及时绑定邮箱和手机立即绑定

改造不适用于特定版本的机器人

改造不适用于特定版本的机器人

幕布斯7119047 2022-09-22 15:58:13
我在运行Android 4.3的模拟器上遇到改造问题,我的设备在Android 4.4.2上,而相同的代码在另一个带有Android 7.1.1的模拟器上正常运行每次尝试执行请求时,我都会收到一个超时异常。getjava.net.SocketTimeoutException: failed to connect to jsonplaceholder.typicode.com/2606:4700:30::681c:3f5 (port 443) after 10000ms         at libcore.io.IoBridge.connectErrno(IoBridge.java:159)         at libcore.io.IoBridge.connect(IoBridge.java:112)         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)         at java.net.Socket.connect(Socket.java:842)         at okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.java:73)         at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:246)         at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:166)         at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)代码如下public interface Api {    String BASE_URL = "https://jsonplaceholder.typicode.com/";    @GET("posts")    Call<ArrayList<Post>> getPosts();}和对 API 的调用Retrofit retrofit = new Retrofit.Builder()        .baseUrl(Api.BASE_URL)        .addConverterFactory(GsonConverterFactory.create())        .build();Api api = retrofit.create(Api.class);Call<ArrayList<Post>> call = api.getPostes();Log.i("RequestUrl", call.request().url().toString());call.enqueue(new Callback<ArrayList<Post>>() {    @Override    public void onResponse(Call<ArrayList<Post>> call, Response<ArrayList<Post>> response) {        mPostsList.setValue(response.body());    }    @Override    public void onFailure(Call<ArrayList<Post>> call, Throwable t) {        Log.e("Posts", "Error occurred", t);    }});
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

它读取 ,最初建议提高客户端的连接超时值,正如本答案中所解释的那样 - 但是在查看当前的源代码时...这暗示了不兼容的协议。java.net.SocketTimeoutExceptionokhttp3.internal.platform.AndroidPlatform

服务器的SSL证书支持 ,因为这是安卓4.x所必需的(他们这边没有问题);问题在于,当前版本的 不再支持,因此握手永远不会发生(这就是为什么它抛出这样的误导而不是)。TLS 1.0OkHttp3TLS 1.0SocketTimeoutExceptionSSLHandshakeException


使用 ,仍应支持默认配置OkHttp33.12.xMODERN_TLS -

但是可以指示使用配置来代替:OkHttp33.13.xCOMPATIBLE_TLS

/* ConnectionSpec.MODERN_TLS is the default value */

List tlsSpecs = Arrays.asList(ConnectionSpec.MODERN_TLS);


/* providing backwards-compatibility for API lower than Lollipop: */

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {

    tlsSpecs = Arrays.asList(ConnectionSpec.COMPATIBLE_TLS);

}


OkHttpClient client = new OkHttpClient.Builder()

    .connectionSpecs(tlsSpecs)

    .build();

还必须将其设置为以下客户端:Retrofit

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(Api.BASE_URL)
    .addConverterFactory(GsonConverterFactory.create())
    .setClient(client)
    .build();

请参阅 TLS 配置历史记录,了解每个版本的可用协议支持。看起来,甚至已经支持 ,因为将来需要 Android 。它甚至可能不需要降级,因为仍然有支撑,而在它已经被移入;仍然不确定。OkHttp33.12.xTLS 1.3QOkHttp3MODERN_TLS3.12.xTLSv13.13.xCOMPATIBLE_TLS3.14.x

即使使用 的当前版本,仍然可以将所需的协议添加回去,因为这是一个带有方法的方法 - 没有任何保证,不会有进一步的不兼容性; 可能仍然是支持Android 4.x版本的最佳选择,甚至可能有新功能的后移植。OkHttp3TLS 1.0ConnectionSpec.COMPATIBLE_TLSArrayList.add()3.12.x


查看完整回答
反对 回复 2022-09-22
?
森栏

TA贡献1810条经验 获得超5个赞

如果您使用安卓 9(饼图)或高于 28 的安卓 SDK,并通过 Api 调用通过改造获得问题。

将此行添加到清单
改造问题android:usesCleartextTraffic="true"


查看完整回答
反对 回复 2022-09-22
?
UYOU

TA贡献1878条经验 获得超4个赞

21之前的安卓有一些缺少SSL和改造将不起作用。使用谷歌服务,您可以在HTTP请求工作后更新设备协议


    //compile 'com.google.android.gms:play-services-base:11.0.0'

     //remember to add the library in your dependencies


        //compile 'com.google.android.gms:play-services-base:$currentVersion'


        ProviderInstaller.installIfNeededAsync(this, new ProviderInstallListener() {


            @Override


            public void onProviderInstalled() {


                //Do your http request here


            }



            @Override


            public void onProviderInstallFailed(int errorCode, Intent recoveryIntent) {


                //sad face :C is sad


            }


        });


查看完整回答
反对 回复 2022-09-22
  • 3 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信