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

Google Nearby自动启用Wi-Fi Direct致Android应用无法联网求助

解决Google Nearby自动启用Wi-Fi Direct导致断网的方案

我之前也碰到过这个头疼的问题!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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:55