最近项目需求,需要android同时可以访问内网以及外网,即不同的通信走不同的网络,查阅相关资料后确定可行,但需一定的条件
1. 前提必备条件:
1) 控制板搭载的android系统版本需要5.0以上
2) 控制板搭载的android系统需要同时支持多网络连接共存,即满足wifi网络,移动网络,网卡能够同时连接且分配到各自网络的IP地址,不能出现连接一个网络后自动将另一个网络断开(反例:当前控制板连接WiFi,但在网口接入网络后自动断开并关闭WIFI连接,且之后无法手动连接WIFI)。
2. 使用系统提供的API进行网络连接时自定义选择相应的网络(示例代码如下)
final ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
//需要android 系统5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && connectivityManager != null) {
NetworkRequest.Builder builder = new NetworkRequest.Builder();
//选择连接数据走的网络,这里示例为WiFi,可根据不同的连接需要选择不同的网络即可
builder.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
NetworkRequest networkRequest = builder.build();
connectivityManager.requestNetwork(networkRequest, new ConnectivityManager.NetworkCallback() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onAvailable(final Network network) {
super.onAvailable(network);
//网络接通后
SocketFactory socketFactory = network.getSocketFactory();
//如果使用eclipse MQTT 包,则需设置
mqttConnectOptions.setSocketFactory(socketFactory);
//如果使用常规的网络连接,okhttp ,则需设置
OkHttpClient okHttpClient = new OkHttpClient.Builder()
//.proxy(Proxy.NO_PROXY)
.socketFactory(socketFactory)
.dns(new Dns() {
@Override
public List<InetAddress> lookup(@NonNull String hostname) throws UnknownHostException {
return Arrays.asList(network.getAllByName(hostname));
}
})
.build();
Retrofit retrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://wanandroid.com/")
.addConverterFactory(ScalarsConverterFactory.create())
.build();
apiService = retrofit.create(ApiService.class);
showMsg("网络已连接 ");
}
});
}