Android 同时连移动数据与无网WiFi时 指定WiFi接口发起网络调用
Android双网并存环境下强制指定WiFi接口发起备份上传的实现方案
核心实现逻辑
Android从5.0开始提供多网络绑定API,不需要断开任意现有连接,即可指定特定请求走对应网络接口,完全适配当前场景:
- 前置权限配置
在AndroidManifest.xml中声明以下权限,Android 6.0及以上版本需在代码中动态申请:<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> - 获取无互联网WiFi对应的Network实例
通过ConnectivityManager注册专门监听WiFi传输类型的网络回调,不要添加互联网能力筛选条件,否则系统会过滤掉这个无公网连接的WiFi,无法拿到对应实例:private ConnectivityManager mConnectivityManager; private Network mBackupWifiNetwork = null; private void initBackupWifiMonitor() { mConnectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest wifiRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) // 不要添加NET_CAPABILITY_INTERNET筛选,否则无法识别无公网的WiFi .build(); mConnectivityManager.registerNetworkCallback(wifiRequest, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); mBackupWifiNetwork = network; } @Override public void onLost(@NonNull Network network) { super.onLost(network); mBackupWifiNetwork = null; } }); } - 强制备份上传流量走WiFi接口
拿到mBackupWifiNetwork实例后,所有和4G路由器备份相关的请求都绑定到这个Network上,不会走默认的移动数据路由:- 若使用
HttpURLConnection:直接调用mBackupWifiNetwork.openConnection(你的备份接口URL)生成连接对象,该连接所有流量自动走WiFi通道 - 若使用OkHttp3等第三方网络库:构建备份专用的OkHttpClient实例时,将socket工厂设置为
mBackupWifiNetwork.getSocketFactory(),所有通过该Client发出的请求都会固定走WiFi - 若使用Socket直连路由器TF卡的服务端口:直接调用
mBackupWifiNetwork.getSocketFactory().createSocket(路由器局域网IP, 服务端口)即可,不需要修改全局路由 - 若需要某段时间内备份相关的所有逻辑都走WiFi,可以临时调用
mConnectivityManager.bindProcessToNetwork(mBackupWifiNetwork),备份完成后调用mConnectivityManager.bindProcessToNetwork(null)恢复默认路由,不会影响其他业务走移动数据访问公网
- 若使用
注意:API 21-22版本可使用
ConnectivityManager.setProcessDefaultNetwork()替代bindProcessToNetwork()方法,API23及以上版本统一使用bindProcessToNetwork()。
校验注意事项
- 发起上传前先判断
mBackupWifiNetwork不为空,避免WiFi断开时上传失败 - 可以通过
mBackupWifiNetwork.getByName(路由器局域网域名/IP)验证地址解析结果是否为局域网段IP,确认路由出口正确 - 不要主动修改网络的能力标记,避免系统把全局默认路由切到无公网的WiFi上,影响正常公网业务
内容的提问来源于stack exchange,提问作者Azizi Musa
相关产品推荐
相关产品推荐

