Android应用已通过代码连接Wi-Fi但无法访问网络求助
Android WiFi程序化连接后应用无法访问网络的排查与解决
核心问题:未绑定进程到目标WiFi网络
通过ConnectivityManager.requestNetwork()成功连接WiFi后,系统仅完成网络链路建立,但应用默认仍使用系统全局默认网络,不会自动切换到新连接的WiFi。必须手动绑定进程或请求到该Network实例。
解决方法1:绑定整个应用进程到目标网络
在onAvailable回调中添加进程绑定逻辑:
@Override public void onAvailable(@NonNull Network network) { super.onAvailable(network); connectionStatus[0] = "true"; // 绑定当前进程到该WiFi网络 ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { cm.bindProcessToNetwork(network); } else { ConnectivityManager.setProcessDefaultNetwork(network); } }
如需恢复默认网络,调用cm.bindProcessToNetwork(null)即可。
解决方法2:为单个网络请求绑定目标网络
若无需全局切换,可针对特定请求(如OkHttp、HttpURLConnection)指定使用该网络:
- OkHttp示例:
OkHttpClient client = new OkHttpClient.Builder() .socketFactory(network.socketFactory()) .build();
- HttpURLConnection示例:
URL url = new URL("https://example.com"); HttpURLConnection conn = (HttpURLConnection) network.openConnection(url);
额外排查项
- 补充网络能力标识:构建
NetworkRequest时,需添加NET_CAPABILITY_INTERNET,否则系统判定该网络无互联网访问权限:
networkRequestBuilder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
- 保留NetworkCallback引用:匿名
NetworkCallback易被GC回收导致连接丢失,建议将其声明为类成员变量:
private ConnectivityManager.NetworkCallback mWifiCallback; // 初始化回调 mWifiCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(@NonNull Network network) { // 处理逻辑 } @Override public void onLost(Network network) { // 处理逻辑 } }; // 请求网络时传入 cm.requestNetwork(networkRequest, mWifiCallback);
- 验证位置权限:Android Q及以上版本连接WiFi需
ACCESS_FINE_LOCATION权限,确保Manifest已声明并完成动态申请:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

