You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:57:19