OkHttp路由交通投掷wifi和SocketFactory

时间:2017-12-23 16:05:06

标签: android okhttp3 android-networking okhttp

我需要路由特定的请求抛出wifi,甚至wifi"连接,没有互联网"和"移动数据"开启了。

下面的示例适用于HttpURLConnection,但不适用于OkHttp3(3.8.1),它是app的主要网络库:

以下代码按预期使用OkHttp版本: 3.4.2

但自OkHttp版本以来已经破了: 3.5.0

OkHttpClient.Builder builder = new OkHttpClient.Builder();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        final Network[] networks = connectivityManager.getAllNetworks();

        for (final Network network : networks) {
            final NetworkInfo netInfo = connectivityManager.getNetworkInfo(network);
            if (netInfo.getType() == ConnectivityManager.TYPE_WIFI && netInfo.getState() == NetworkInfo.State.CONNECTED) {

             // just for example HttpURLConnection works as expected and route traffic throw wifi
             connection = (HttpURLConnection) network.openConnection(url);

             // not works since >=3.5.0, route traffic in same way
             builder.socketFactory(network.getSocketFactory());

            }
        }
    }

OkHttpClient client = builder.build();
final Response response = client.newCall(initialRequest).execute();

client.newCall没有像我理解的那样按预期工作,或者我简单地遗漏了一些东西。

1 个答案:

答案 0 :(得分:1)

最后,我找到了。

https://github.com/square/okhttp/commit/2a5fb08b39195d4238c7117e851e9221f94de62a#diff-ec23bee7240c28053b0ca4fbc6029529

因此,如果您想获得旧的行为(如3.4.2版本),您可以使用java.net.ProxySelector.getDefault()并将其包装为也尝试NO_PROXY。

在我的情况下,如上所述,我需要在添加socketFactory之前手动禁用代理:

builder.proxy(Proxy.NO_PROXY);
builder.socketFactory(network.getSocketFactory());