Google Nearby自动启用Wi-Fi Direct致Android应用无法联网求助
我之前也碰到过这个头疼的问题!Google Nearby Connections确实会在某些场景下自动切换到Wi-Fi Direct——尤其是当它判定点对点连接更高效的时候,但这完全会搞砸需要依赖互联网的API请求。以下是我亲测有效的几个解决思路:
强制指定连接介质,禁用Wi-Fi Direct
Nearby Connections默认会自动选择最优连接方式,但你可以通过ConnectionOptions明确限制它可用的传输介质,只保留蓝牙和蜂窝网络,直接排除Wi-Fi Direct:val connectionOptions = ConnectionOptions.Builder() .setAllowedMediums(ConnectionOptions.MEDIUM_BLUETOOTH or ConnectionOptions.MEDIUM_CELLULAR) .build() // 发起连接时传入这个配置 nearbyConnections.requestConnection( "你的设备名称", targetEndpointId, connectionCallback, connectionOptions )这样设置后,Nearby就不会触发Wi-Fi Direct了,设备能稳定保持互联网连接。
监听网络状态,自动切回正常Wi-Fi
如果你的场景必须保留Wi-Fi Direct的可能性(比如需要高速传输大文件),可以注册一个网络状态广播接收器,当检测到Wi-Fi Direct启用导致互联网断开时,手动切换回用户之前连接的Wi-Fi网络:// 注册网络变化监听 IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkSwitchReceiver, filter); // 接收器逻辑 private BroadcastReceiver networkSwitchReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isWifiDirectActive = activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI && activeNetwork.getSubtype() == WifiManager.TYPE_WIFI_DIRECT; boolean hasInternet = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); // 如果是Wi-Fi Direct且无互联网,切回之前保存的Wi-Fi if (isWifiDirectActive && !hasInternet) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); // 这里需要提前保存用户之前连接的Wi-Fi的networkId wifiManager.enableNetwork(savedWifiNetworkId, true); } } };记得在Manifest里声明必要权限:
ACCESS_NETWORK_STATE、CHANGE_WIFI_STATE、ACCESS_WIFI_STATE,Android 6.0以上还要动态申请权限。换用Nearby Messages API(如果场景适配)
如果你不需要设备间的高速点对点传输,只是需要简单的消息互通,Nearby Messages API会更友好——它用蓝牙、BLE或超声波传递消息,不会强制启用Wi-Fi Direct,设备能全程保持正常联网状态。
另外补充个小提醒:部分旧Android版本上,即使指定了介质,Nearby偶尔还是会有小概率触发Wi-Fi Direct,这时候结合网络监听的方案会更稳妥。
内容的提问来源于stack exchange,提问作者develotr

